私はPythonでいくつかの実験をすることを考えていました。 javascriptのsetTimeoutやsetIntervalのような機能をいくつか紹介して、イベントループを開始するためのブロッキング呼び出しを行わずに何らかの非同期動作を移植したいと考えています。Python GILをCモジュールでバイパスすることはできますか?
はのは(今もちろん動作していない)、この例を見てみましょう:
from mymod import set_timeout # of course we love the PEP8 :)
import sys, time
def say_finished():
time.sleep(2) # waiting, suppose here to have some blocking behaviour
sys.stdout.write("\nSee you!")
sys.stdout.write("Hello, ")
set_timeout(say_finished, 2000) # supposing we have msec granularity
sys.stdout.write("World!")
私はjavascriptのような挙動をしていたいのです。 set_timeoutがGILのために新しいスレッドを開始していた場合、新しいスレッドは終了するまでメインスレッドをブロックするので、 "Hello、\ nSee you!World"を出力します。
set_timeoutがCコードでposixスレッドを使用すると、この問題を回避できますか? これはPython C/APIとの統合であり、GILをバイパスできるかどうか、またはAPI自体もGILによってブロックされているかどうかわかりません(私は試してみましたが、今は勉強していますドキュメントと私は自分自身を試して準備ができていない)。
これは、次のようになります。印刷「こんにちは、」 - >実行SET_TIMEOUT(つまり、インタプリタがプログラムの実行を進めるためにできるように返す必要があります) - >印刷「の世界!」 - >外部スレッドが実行されている間は生きている - >コールバック "say_finished" - >終了。私はそれがインタプリタ自体を編集することが必要であろうと思わせる何か
は、「外部のスレッドが実行されている間生き続ける」という部分です。
新しいプロセスが作成するオーバーヘッドのために、プロセスを使用したくありません。
私はPythonの構文を愛し、私はそれで、このアプローチを使用したいので、「その後、Javascriptを使用して」言わないでください。
あなたが書いていることはほぼ正確に 'threading.Timer'です。 http://docs.python.org/library/threading.html#timer-objects –