
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 掉主线程吧,我回头试试看。 |