1
mooncakejs 2016 年 10 月 4 日 via iPhone
我猜是 gil
|
2
alqaz 2016 年 10 月 4 日
应该是楼上说的原因,而且 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 月 4 日
第三种只适用于 IO 堵塞, 并且 C/C++层有暴露相应的 fd 的接口可以加到 gevent 的 ioloop 里.
第二种倒是通用, 但前提是拿 C 或者 Cython 嵌一层释放 GIL 的包装. |
4
wangxn 2016 年 10 月 4 日 via Android
在 Func_from_CPP() 里面使用原生线程才行。如 std::thread 什么的。
|
5
hihihihihi OP 现在问题是我不可能去修改那部分 cpp 代码
|
7
ericls 2016 年 10 月 4 日 via iPhone
可以用 asyncio.run_in_executor 试一下 需要用 processpoolexecuror
|
8
zhuangzhuang1988 2016 年 10 月 4 日 via iPad
因为没有释放 Gil
|
9
zhuangzhuang1988 2016 年 10 月 4 日 via iPad
推荐看 time.sleep 的 c 实现就知道了。。
|
10
binux 2016 年 10 月 4 日
丢进程里处理就完了呗。
|
11
hihihihihi OP @binux 丢给进程处理,也要在 thread.join() 等待完成吧。还是会 block 掉主线程吧,我回头试试看。
|