あなたが標準ライブラリに含まれていない未来を、使用することができますが、非常にシンプルに実装する:
from threading import Thread, Event
class Future(object):
def __init__(self, thunk):
self._thunk = thunk
self._event = Event()
self._result = None
self._failed = None
Thread(target=self._run).start()
def _run(self):
try:
self._result = self._thunk()
except Exception, e:
self._failed = True
self._result = e
else:
self._failed = False
self._event.set()
def wait(self):
self._event.wait()
if self._failed:
raise self._result
else:
return self._result
あなたはこのように、この特定の実装を使用します「メイン」スレッドを持たないシステムを使用する場合、「待機」を呼び出すタイミングを判断することは困難です。あなたは明らかに答えが必要になるまで、明らかに処理を止めたくありません。
Twistedでは、deferToThread
を使用すると、メインループに戻ることができます。それが終了していますときに実際に原子炉と終了を起動するために、あなたにもこれを実行する必要があると思いますが、
import time
from twisted.internet import reactor
from twisted.internet.task import deferLater
from twisted.internet.threads import deferToThread
from twisted.internet.defer import inlineCallbacks
def work():
for x in range(3):
time.sleep(1)
print 'Tick...'
print 'Done!'
return 'Result!'
@inlineCallbacks
def main():
print 'Starting up...'
d = deferToThread(work)
print 'Doing more main thread work...'
yield deferLater(reactor, 1.5, lambda : None)
print "Now 'waiting'..."
print 'Got result: %s' % (yield d)
::ツイストで慣用的に同等のコードは、このようなものになるだろう
reactor.callWhenRunning(
lambda : main().addCallback(lambda _: reactor.stop()))
reactor.run()
Twistedとの主な違いは、メインスレッドで他のタイムスタンプが発生すると、他のネットワーク接続がトラフィックを獲得し、GUIでボタンがクリックされます。その作業はシームレスに行われます。deferLater
とyield d
は実際にはスレッド全体を停止する、彼らは "メイン"を一時停止するinlineCallbacks
コルーチン。
Dave BeazlyはGILのプレゼンテーションで、I/O中にGILがリリースされていると述べています(また、I/Oについて話し、USB情報を待っています)。現在の状況:反対の情報を与えている2つのアーチファミン主義者。私は今何をすべきですか? – bayer
あなたはGILに関してC++コードが何をしているのかまだ分かりません。あなたはそれがI/Oをし、GILをリリースするかどうかわからない場合、あなたは知らない。これは矛盾したアドバイスではありません。これは「あなたが何かを知らないときに何をすべきか」というアドバイスです。わからないときはマルチプロセッシングを使用してください。 –
@ S.Lottは正しい:I/O Beazleyの話は、Pythonの標準ライブラリを介して行われたものである - 神秘的なSWIGged C++ライブラリは協力するかもしれないし、協力しないかもしれない。 [私が知っていることについて知っている唯一の文書は、SWIGでのGILハンドリングについて - http://matt.eifelle.com/2007/11/23/enabling-thread-support-in-swig-and-python/を参照してください。 well-documented feature ;-)]] –