Thread
sとGreenlet
sは、インタラクティブ環境では異なる動作をします。場合によっては、メインイベントループをハッキングする必要があります。
Greenlet
gevent
Pythonの並行タスクであるモジュールからのものです。Python(pthread)とは別に内部コンテキストスイッチングがあり、同時実行性は(私の経験では)非常にうまく機能します。Greenletsの問題のいくつかは、モンキーパッチが適用されていない場合(モジュール内gevent
)、Cシステムコールとソケットの相互作用のブロックをブロックすることです。
グリーンレットが正しく機能するためには、メインのイベントループにパッチを適用する必要があります...インタラクティブな環境でグリーンレットを生成すると、コンテキストが切り替えられて実行されないため、パッチを適用する方法を頭のてっぺんから忘れてしまいました。メインイベントループ(後で追加します)。
失敗の例:
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()
編集:
このプロジェクトのコードのいくつかを見た後、geventを使用するためにipython入力フックをハッキングした方法は次のとおりです
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