-
Notifications
You must be signed in to change notification settings - Fork 111
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
请问在Swow 的协程中是否可以使用 sleep方法 #231
Comments
感觉是因为没有支持 Oracle 的协程化,sleep 是支持的,你把数据库逻辑部分去掉应该就可以验证这个事情了。 |
但我尝试改了一下上面的代码,如下:
只是去掉了 for update 行锁,同时对不同的 coroutine 业务 sleep 了不同的时间,输出如下:
从结果上看,协程内 sleep 使用确实是没问题的。如上,Coroutine #3 后启动,但因 sleep 时间较短,反而先结束,应该从侧面也证明了 oracle 是有协程化的,那问题出在 for update 上吗?只要有 for update语句,再加上 sleep,业务就会卡住,不知为何? |
如果oracle是有协程化你连接oracle就会挂起,执行其他协程去了。你上面这段代码很好解释第一个协程sleep触发了协程挂起向下执行代码开启了第二个协程,这个时候第二个协程sleep也挂起了这时候代码应该跑到 |
关于你第一个代码提出来的问题。感觉很复杂我个人感觉是事务问题。不太懂oracle可能是事务没有commit导致for update或者beginTransaction的卡主了 |
3Q,明白了。 |
问个无关的问题哈。Swoole 是通过 hook 阻塞方法实现的协程调度,Swow 是怎么做到遇到 sleep 这样的阻塞方法发生协程调度的? |
我不太清楚你说的hook是指什么 如果指的是php函数“zif_sleep()” 被换成了sw*的函数"zif_sw*_sleep()" 那sw*的做法是一致的 如果你问的是实现它们的东西: php本身是调用sleep(unix)/Sleep函数(windows),操作系统会暂停当前线程,吧cpu用于其他线程 |
好的,谢谢。看来处理阻塞方法:sleep、pdo、fopen、fread 等等,swow 和 swoole 的思路是一致的。 |
最近在尝试用 swow 写一点试验性的东西,但发现在协程中使用了 sleep() 后,程序逻辑就无法正常运行了,代码如下:
如果不加 sleep,上面的代码是正常的,输出如下:
但我加上 sleep(5)后,就会卡在第一个协程里的 sleep 处,一直无法继续后续响应:
是否协程中无法使用系统原生 sleep?我知道 swoole 中的协程是不能这样用的,Swow 是否也一样?可有什么替代的方式?
The text was updated successfully, but these errors were encountered: