- 博客(31)
- 收藏
- 关注
原创 skynet 源码分析-创建service
书接上文, 在加载了各种配置, 初始化全局变量(handle_storage , global_queue, env, module, timer, epoll_socket) 之后, 接下来就要创建实际的service, 本文将详细讲述skynet 创建service 的流程。
2025-02-16 15:07:53
1625
原创 skynet 源码之初始化
个人博客skynet 的机制相当于在 c 代码里注册一个lua 虚拟机, 在其中解释lua 代码, 并通过c 内存在lua 各个线程之间共享使用, 接下来开始看skynet 的启动流程。
2025-02-12 23:09:24
575
原创 skynet 从demo到源码之 server-client(单机模式)demo
搜了一下skynet相关的, 大部分都是讲怎么用的, 这也没啥, 但csdn上好多人讲个源码还收费, 毫无开源精神, 还是希望把这个东西从使用到源码讲出来, 顺便自己的博客。下一章开始从源码分析这个简单的demo 是如何运行的。
2025-02-12 22:27:09
203
原创 Reactor实例之 muduo 源码分析
首先宣传一下自己的博客, 因为一些不可抗因素同步到csdn, 上面的内容层级分块更清晰一些,内容基本相同Reactor模型中, muduo网络库算是比较简单的一个, 源码也比较容易看, 本文以muduo中的组件为例进行说明, 其他的组件类似。
2025-02-10 21:39:23
627
原创 linux网络编程
信号驱动I/O是通过内核发送信号(如SIGIO)来通知进程某个I/O操作已准备好,而不需要进程主动去检查文件描述符的状态。该模型通常用于异步通知I/O事件的发生,避免了轮询操作,从而减少了CPU的浪费。通过sigaction注册处理SIGIO信号的回调函数。相比于select,poll扩展了文件描述符的个数,但其还是使用遍历所有描述符的方式检查事件触发。信号,当I/O操作准备好时,内核会发送此信号,并触发该函数,读取数据并进行处理。:使套接字支持异步I/O,进程可以通过信号接收I/O事件通知。
2025-02-10 20:51:14
889
原创 c++ 无锁线程安全stack
最近看了本多线程的书, 记录下笔记#include <atomic>#include <memory>#include <thread>#include <future>#include <vector>#include <chrono>namespace lock_stack { template<typename T> class lock_free_stack { private
2022-01-22 16:16:17
623
原创 python协程 同步函数的异步使用
import subprocessimport asyncioimport timedef get_cmd(cmd): proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) out, err = proc.communicate() return out, errasync def main(cmd): l = asyncio.get_event_loop() future =
2021-09-21 22:17:56
893
原创 c++ 互斥量的常见问题(未保护共享数据)
namespace mutex_invalid { void func_asign(void(*func)(int&), int& data) { std::cout << "in func: " << data << std::endl; func(data); // data 传入的本意可能只是在线程中使用, 而不是修改 } void func_asign_test(int& num
2021-09-17 22:59:35
167
原创 c++ 文件对比
#include <iostream>#include <fstream>#include <cstring>#include <cstdio>/*pos, file1 偏移量pos1, file2 偏移量end, 对比的字符个数*/bool compare_file(const std::string &f1, const std::string &f2, size_t pos=0, size_t pos1=
2021-06-10 17:58:01
1016
原创 django 从零开始之模型 关联关系及常见字段
0. 如何生成一个可移动的模型在添加了新的模板后, 使用前文提到的生成一个可读模板的命令:python manage.py makemigrations这次的代码新加了Person 类, 即模型1.常见的字段类型class Person(models.Model): id = models.IntegerField(primary_key=True) # id = models.AutoField(primary_key=True) first_name
2021-03-22 21:31:56
238
原创 django 从零开始系列四 简单应用的升级
有些事情, 忙不过来, 先放代码, 之后再解释polls/views.py:from django.shortcuts import get_object_or_404, renderfrom django.http import HttpResponse, HttpResponseRedirectfrom django.urls import reversefrom django.views import genericfrom .models import Question, Choice
2021-03-14 18:27:00
84
原创 django 从零开始系列四 编写一个简单的django应用
先上代码, 然后解释, 如有错误, 欢迎指正1. 代码polls/views.pyfrom django.shortcuts import get_object_or_404, renderfrom django.http import HttpResponsefrom .models import Question# Create your views here.def index(request): latest_question_list = Question.object
2021-03-11 22:42:33
103
原创 django 从零开始系列三 django管理页面
1. 创建管理员运行以下命令, 开始创建管理员python manage.py createsuperuser启动django, 访问 http://127.0.0.1:8000/python .\manage.py runserver2. 加入应用修改 polls/admin.pyfrom django.contrib import adminfrom .models import Question# Register your models here.admin.si
2021-03-09 21:16:25
124
原创 django 从零开始系列二 数据库及模型
1. 数据库配置mysite/settings.py 文件中, 数据库配置如下常见的engine :django.db.backends.sqlite3django.db.backends.postgresqldjango.db.backends.mysqldjango.db.backends.oracle开启一个数据库python manage.py migratemysite/settings.py 中的 Installed_apps 配置了 django 中的应用
2021-03-07 21:53:04
100
原创 Django 从零开始系列一 安装并创建 django服务
因为工作原因一直没有机会使用这款传说级别的框架, 打算抽时间专门学习, 本系列主要对照官网的文档, 加上自己的一些理解1. 安装pip install django执行 python -m django --version, 返回django 版本号, 表示安装成功2. 通过命令行创建项目# 创建一个空目录, 进入目录, 执行django-admin startproject mysite创建的目录结构如下manage.py: 一个让你用各种方式管理 Django 项目的命令
2021-03-07 14:26:20
172
原创 linux 三剑客之 awk
测试文件:通俗用法:awk ‘/pattern/{print $1}’ file示例: 匹配以 root 开头的行并输出结果在上面的例子中, 如果需要以 : 分割, 则需要指定分隔符两种方式:awk -F":" '/pattern/{print $1}' fileawk 'BEGIN{FS=":"} /pattern/{print $1}' file在末尾如果还需要打印其他信息, 可以使用END{}:awk 'BEGIN{xxx} {print $} END{xxx}' f
2020-09-14 19:31:21
115
原创 linux 三剑客之sed
用法测试文件s 替换替换 s/xxx/xxx示例: 将 gggg 替换为 test替换某行为xxx ns/.*/xxxx示例: 替换第二行内容为 xxxx在某行后追加内容 ns/.*/&xxxx示例: 在第三行内容后追加 ----替换数字 s/[0-9]/xxxx (sed不支持 \d)示例: 替换数字为 ---代指某一部分使用() s/(xxx)(xxx)/\1\2/示例: 在数字与内容之间插入内容语法中的 / 可以替换为其他任意
2020-09-14 14:59:29
131
原创 linux三剑客之grep
grep用法:常规匹配:不区分大小写 -i精确查找 “\<xxxx>\”以某字符结尾 “xxx$”以某字符开头 “^xxx”显示行号 -n显示匹配字符的后几行 -A n显示匹配字符的前几行 -B n显示匹配字符的上下文 -C n静默查找, -q如果文件不存在, 静默查找仍会有输出, 如果需要静默可以考虑输出重定向grep查找结果成功返回值 0, 没有查找到返回 1, 无文件返回 2递归查找 -r/-R反向查找 -v和管道一起
2020-09-14 10:32:12
164
原创 shell while, until循环
while和until两个循环语法相同, 循环条件相反语法: while xxx do xxx done until xxx(进入循环的条件与while相反) do xxx done举例来看#! /bin/bashuntil ping -c1 127.0.0.1>/dev/nulldo echo "until test" sleep 1doneecho "until test finished"while ping -c1 127.0.0.1>
2020-08-31 10:46:29
121
原创 linux expect实现非交互式脚本
之前有个需求, 客户要批量给服务器装mongo做副本集, 在安装过程中需要手动输入一些比如ssh密码的东西, 刚好用到expect, 顺便记录自己的机子是deepin, 一些命令的过程中需要sudo 输入密码, 刚好用这个举例在启动docker容器的时候, 需要手动输入密码, 我们就用脚本代替手动输入实现启动:先看 docker container 的状态, 目前是没有启动的写脚本:#! /bin/expectspawn sudo docker ps -aexpect { "sudo
2020-08-29 14:48:45
201
原创 记录一次 linux 虚拟机扩容
自己的虚拟机环境最开始分配的空间有点小, docker占得不够用了, 记一次扩容流程可以看到, 原先虚拟机只有20G, 我们进入虚拟机设置, 扩展至40G扩展完成后, 提示需要进入系统重新分区, 接下来我们进入系统进入系统后, 可以看到当前容量只有原来的 20G通过 fdisk -l 命令可以看到, 硬盘已经扩容到 40G, 但还没有挂载到分区, 接下来我们新增一个分区接下来我们扩展分区, 操作如下:...
2020-08-28 08:12:44
148
原创 shell for循环及一些小技巧
for语法#! /bin/bashclearfor i in {1..10}do echo "for time $i"donefor循环分隔符分隔符顾名思义, 循环时以什么符号作为分隔, 默认情况下是以空格或者制表符分隔#! /bin/bashnum="1 12 23 34 4"for i in $numdo echo $idone结果可以看到, 是以空格为分隔输出的, 如果需要以行分隔, 这个时候就需要指定分隔符了#! /bin/bashnum="
2020-08-26 14:00:46
592
原创 shell case语法
一般来说, case会和read一起使用, 以esac结束, 代码如下#! /bin/bashread -p 'input num:' numcase "$num" in 1) echo "num=1" ;; 2) echo "num=2" ;; *) echo "num=$num" ;;esac执行结果:
2020-08-24 21:03:07
113
原创 matplatlib实例三 水平条形图
先瞅代码fig, ax = plt.subplots()ax.barh(1, 10, xerr=0.3, align='center')ax.barh(2, 5,)ax.barh(3, 8,)ax.set_yticks([1, 2, 3])ax.set_yticklabels(["blue", "yellow", "green"])ax.invert_yaxis() # y轴顺序翻转ax.set_title("11")plt.show()
2020-08-20 21:52:23
143
原创 matplatlib实例二 分组柱状图
label = ["A", "B", "C"]num1 = [10, 20, 16]num2 = [15, 10, 25]x = np.arange(len(label))fig, ax = plt.subplots()r1 = ax.bar(x-0.3/2, num1, 0.3, label="num1")r2 = ax.bar(x+0.3/2, num2, 0.3, label="num2")ax.set_xticks([0, 1, 2]) # list of location
2020-08-17 19:36:37
272
原创 matplotlib实例一 分段式柱状图(堆叠式柱状图)
话不多说, 先看代码labels = ['A', 'B', 'C', 'D', 'E']blue = [10, 20, 30, 40, 50]yellow = [35, 15, 25, 20, 10]blue_err = [1, 1, 1, 1, 1]yellow_err = [1, 1, 1, 1, 1]width = 0.5fig, ax = plt.subplots()ax.bar(labels, blue, width, yerr=blue_err, label='blue',
2020-08-17 00:12:22
4182
2
原创 shell 条件测试
常见方式:test[][[]]使用方法:test:test -r ./test.sh | echo $?0[]:[ -r test.sh ]; echo $?0关于[], 左括号 [ 是一个linux命令, 而右括号]仅仅是左括号的命令参数, 如下图可以看到, 左括号 [ 提示缺少右括号 ], 而右括号本身不是一个命令[[]]:语法与 [] 相同, [[]]功能更强大, 推荐使用num=1[[ $num =~ [0-9] ]]; echo %?0常用参数:
2020-08-15 16:45:03
96
原创 shell $符之$* $@ 区别
上篇文章有坑, 填在字符串中(在" "中), $@可以理解为将位置参数放在一个数组里, 各是各的$*类似于字符串连接, 将个位置参数的值拼接在一起, 是一个整体如果是直接引用 $@ 或者 $* 两者不会出现以下区别具体代码:...
2020-08-15 14:02:38
220
原创 shell中的 $符变量
预定义变量:$0 脚本名称$! 上一个后台进程的PID$$ 当前进程PID$? 上一个命令返回值$# 参数个数$* $@ 所有的参数(具体什么区别不清楚...)位置变量$1 $2 ... $n示例:
2020-08-12 11:10:59
103
原创 matplotlib 学习二(读取图片)
import matplotlib.cbook as cbookimport matplotlib.pyplot as pltwith cbook.get_sample_data('1.png') as image_file: # 原生只支持png格式 image = plt.imread(image_file)fig, ax = plt.subplots()ax.imshow(image)ax.axis('off') # 不展示坐标系...
2020-06-08 20:52:23
464
原创 matplotlib 学习一
import matplotlibimport matplotlib.pyplot as pltimport numpy as npt = np.arange(0.0, 2.0, 0.01)s = 1 + np.sin(2 * np.pi * t)fig, ax = plt.subplots() # 创建一个figure 和 多个子图ax.plot(t, s)ax.set(xlabel='time(s)', ylabel='voltage(mV)', title="this is tit.
2020-05-19 20:39:00
175
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人