使用pycharm + gevent greenlet.join()不再阻塞

时间:2016-02-19 19:58:37

标签: python python-2.7 pycharm gevent greenlets

所以在通过pycharm运行gevent到1.1rc4(从1.0.2)升级之后,我无法正确加入greenlets ...以此代码为例:

from gevent import monkey, Greenlet, hub
import gevent

hub.Hub.resolver_class = ['gevent.resolver_ares.Resolver']
monkey.patch_all()

def sleepy(time):
    gevent.sleep(time)
    print "done like a good script"

if __name__ == '__main__':
    g = gevent.spawn(sleepy,10)
    g.start()
    g.join()
    print "if this is the only log line, then join didn't work"

将输出:

 "if this is the only log line, then join didn't work"
来自IDE的

,它使用CLI中的相同解释器正常执行

我遵循了cli和gui中的代码,greenlet.join()中的行为更改导致行为hub.switch()存在差异:

 def switch(self):
    switch_out = getattr(getcurrent(), 'switch_out', None)
    if switch_out is not None:
        switch_out()
    return greenlet.switch(self)

最后一行将在greenlet执行之前立即返回... pycharm调试器不会让我进入该代码...

任何帮助都会很棒......当协同工作正常时,协程流量控制就已经足够了......

2 个答案:

答案 0 :(得分:1)

Pycharm使用stdin做了一些魔术(并不总是很好)。

尝试在每个打印语句后立即刷新stdin:

import sys
sys.stdin.flush()

同时在最后添加time.sleep(1)

可能是您的脚本在print语句输出之前退出。我不知道这是否有效,但绝对是一次尝试。

如果它不起作用,请尝试输出到文件,看看它是否正常工作。

答案 1 :(得分:0)

我在jetbrains上打开了一个错误,它被标记为:https://youtrack.jetbrains.com/issue/PY-14992

的副本

我还没有通过gevent查看我的所有调试问题,但这个简单的案例已经在2016年3月23日发布的2016.1版本中修复了