使用 pycharm + gevent greenlet.join() 不再阻塞
using pycharm + gevent greenlet.join() no longer blocks
所以在 gevent 升级到 1.1rc4(从 1.0.2)之后 运行 到 pycharm,我无法让 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)
最后一行将 return 在执行 greenlet 之前立即...
pycharm 调试器不会让我进入该代码...
任何帮助都会很棒...协程流控制在工作时已经够难了...
Pycharm 用 stdin 做了一些魔术(并不总是很好)。
尝试在每个打印语句之后立即刷新标准输入,方法是:
import sys
sys.stdin.flush()
还要在最后加上time.sleep(1)
。
可能是你的脚本在打印语句输出前就退出了。我不知道这是否行得通,但肯定会更糟。
如果不起作用,请尝试输出到一个文件,看看是否能正常工作。
我在 jetbrains 上打开了一个错误,它被标记为重复:https://youtrack.jetbrains.com/issue/PY-14992
我还没有查看 gevent 的所有调试问题,但这个简单的案例已在 2016 年 3 月 23 日发布的 2016.1 版本中得到修复
所以在 gevent 升级到 1.1rc4(从 1.0.2)之后 运行 到 pycharm,我无法让 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)
最后一行将 return 在执行 greenlet 之前立即... pycharm 调试器不会让我进入该代码...
任何帮助都会很棒...协程流控制在工作时已经够难了...
Pycharm 用 stdin 做了一些魔术(并不总是很好)。
尝试在每个打印语句之后立即刷新标准输入,方法是:
import sys
sys.stdin.flush()
还要在最后加上time.sleep(1)
。
可能是你的脚本在打印语句输出前就退出了。我不知道这是否行得通,但肯定会更糟。
如果不起作用,请尝试输出到一个文件,看看是否能正常工作。
我在 jetbrains 上打开了一个错误,它被标记为重复:https://youtrack.jetbrains.com/issue/PY-14992
我还没有查看 gevent 的所有调试问题,但这个简单的案例已在 2016 年 3 月 23 日发布的 2016.1 版本中得到修复