首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
Timer 与 Worker的关系
在使用Timer 的时候有点疑惑,想理清Timer 和 Worker的关系。 我在worker0 中开了一个定时器,用了一个自己实现的单例Redis链接(是在onWorkerStart时初始化的 PRedis::init() ,使用是 PRedis::instance()->get().....),而这个Redis 链接在worker 接受请求时也会用到 我在想Woker 和他的 Timer 共用一个Redis 链接会不会有问题(非协程情况下)
发布于6年前 · 4 次浏览 · 来自
提问
zxyfaxcn
在使用Timer 的时候有点疑惑,想理清Timer 和 Worker的关系。 我在worker0 中开了一个定时器,用了一个自己实现的单例Redis链接(是在onWorkerStart时初始化的 PRedis::init() ,使用是 PRedis::instance()->get().....),而这个Redis 链接在worker 接受请求时也会用到 我在想Woker 和他的 Timer 共用一个Redis 链接会不会有问题(非协程情况下)
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2020-04-14
郭新华
不建议这样用,timer其实在4.4协程下已经不推荐用了,直接 ```php go(function()}{ co::sleep(1); }) ``` 即可,需要使用redis的时候用library里面的自带连接池就行了。 我不知道你的代码到底怎么写的,反正理论上同一个tcp不可以在两个协程里面写/读。
赞
2
回复
2020-04-14
zxyfaxcn
回复
郭新华
现在生产环境上是Swoole 2.1.0,一些代码还不能很好的在协程环境上工作。 要晚些时候迁移。 示例代码如下: ``` function my_onWorkerStart(\swoole_server $serv, $worker_id) { PRedis::init($config); if($worker_id==0){ \Swoole\Timer::tick(100,function(){ $exists = PRedis::instance()->exists('my_key'); // ...对一个过期、异常的事务进行清理 }); } } function my_onReceive(\swoole_server $serv, $fd, $reactor_id, $data) { // 记录事务 PRedis::instance()->set('my_key'); } ``` 想知道会不会出现数据错乱,或是其它问题。
赞
0
回复
2020-04-14
郭新华
没用协程的话没问题,swoole下你只要记住两点就行了。 1,父进程的连接不能在子进程中使用, 2,同一个连接不能在两个协程中使用
赞
1
回复
2020-04-14
zxyfaxcn
回复
郭新华
明白了
赞
0
回复