1
mooncakejs 2016-10-04 18:15:06 +08:00 via iPhone
我猜是 gil
|
2
alqaz 2016-10-04 19:03:07 +08:00
应该是楼上说的原因,而且 Func_from_CPP 这个函数调用了 WaitForSingleObject 函数,这是一个同步操作。 If the object's state is nonsignaled, the calling thread enters the wait state until the object is signaled or the time-out interval elapses.所以,改写这个 c++库?
|
3
Zzzzzzzzz 2016-10-04 19:25:48 +08:00
第三种只适用于 IO 堵塞, 并且 C/C++层有暴露相应的 fd 的接口可以加到 gevent 的 ioloop 里.
第二种倒是通用, 但前提是拿 C 或者 Cython 嵌一层释放 GIL 的包装. |
4
wangxn 2016-10-04 19:34:14 +08:00 via Android
在 Func_from_CPP() 里面使用原生线程才行。如 std::thread 什么的。
|
5
4ever911 OP 现在问题是我不可能去修改那部分 cpp 代码
|
7
ericls 2016-10-04 22:27:19 +08:00 via iPhone
可以用 asyncio.run_in_executor 试一下 需要用 processpoolexecuror
|
8
zhuangzhuang1988 2016-10-04 23:20:21 +08:00 via iPad
因为没有释放 Gil
|
9
zhuangzhuang1988 2016-10-04 23:25:11 +08:00 via iPad
推荐看 time.sleep 的 c 实现就知道了。。
|
10
binux 2016-10-04 23:30:00 +08:00
丢进程里处理就完了呗。
|