Thread
s和Greenlet
在交互式环境中具有不同的行为。在某些情况下,主事件循环必须被破解。
Greenlet
来自gevent
模块,它是python中的并发任务。它具有与Python(pthread)分开的内部上下文切换,并发性非常好(根据我的经验)。 Greenlets的一些问题是,如果它们没有被猴子修补,它们会阻止C系统调用和套接字交互(模块位于gevent
)。
为了让greenlet正常工作,主事件循环需要打补丁......如果你在交互式环境中产生一个greenlet,它将不会切换上下文并执行,我忘记了我的头顶如何修补主事件循环(稍后添加)。失败的
例子:
In [1]: from gevent.greenlet import Greenlet
In [2]: def print_hi():
...: print 'hi'
...:
In [3]: print_hi()
hi
In [4]: g = Greenlet(print_hi)
In [5]: g.start()
编辑:
寻找一些在这个项目上的代码后这里是我们如何破解IPython的输入钩使用GEVENT
import sys
import select
import gevent
def stdin_ready():
infds, outfds, erfds = select.select([sys.stdin], [], [], 0)
if infds:
return True
else:
return False
def inputhook_gevent():
try:
while not stdin_ready():
gevent.sleep(0.001)
except KeyboardInterrupt:
pass
return 0
# install the gevent inputhook
from IPython.lib.inputhook import inputhook_manager
inputhook_manager.set_inputhook(inputhook_gevent)
inputhook_manager._current_gui = 'gevent'
# First import the embeddable shell class
from IPython.frontend.terminal.embed import InteractiveShellEmbed
修补示例:
In [6]: def say_hi():
...: print "hi"
...:
In [7]: g = gevent.greenlet.Greenlet(say_hi)
In [8]: g.start()
In [9]: hi <-- Cursor is here so it printed hi
我不认为这些问题与SYS或OS将永远是不同的,因为Interative的对比两个版本(脚本)在相同的上下文中运行。换句话说,如果你使用“python script.py”或“python -i”,从任何给定的目录中,cwd,路径和环境都是相同的。 –
当你说“在迭代模式”,你说的是运行“python -i”,还是你在谈论通过IDLE运行?这两者之间肯定存在一些差异。 –
好问题,布莱恩奥克利。在这个问题中,我正在考虑'python myscript.py'与'python -i'并手动输入相同的命令。如果你对你的断言充满信心(cwd,路径和环境将是相同的),我会编辑我的问题以删除我的误导性陈述。 – Andrew