私はPykkaアクター ライブラリで遊んでいて、次の素晴らしいばかげた例を思いつきました。
import pykka
from time import sleep
class TestActor(pykka.ThreadingActor):
def on_receive(self, message):
sleep(1)
print(message["v"])
a = TestActor.start()
for i in xrange(10):
print("asking for " + str(i))
a.tell({"v":i})
print(a.stop())
期待される結果が得られます: 10行がすぐに印刷され、別の 10 行がそれぞれ 1 秒間に印刷されます。
asking for 0
asking for 1
asking for 2
asking for 3
asking for 4
asking for 5
asking for 6
asking for 7
asking for 8
asking for 9
0
1
2
3
4
5
6
7
8
9
True
すべてのリクエストがアクターによって処理された後、アクションTrue
の結果として出力されます。stop
アクターを停止して、リマイニング メッセージの受信と処理をキャンセルすることは可能でしょうか。
ライブラリのドキュメントを確認しましたが、見つけることができるのはblock
stop パラメーターだけです。これはまったく異なることを意味します。これを設定するFalse
と、呼び出しは非同期になりますが、メッセージ キューに関する動作は同じです。
停止 (ブロック = True、タイムアウト = なし)
アクターに停止を求めるメッセージを送信します。
アクターが停止しているか、呼び出し時に停止中であった場合は True を返します。アクターがすでに死んでいた場合は false。block が False の場合、結果をラップする future を返します。
アクターが停止を要求される前にアクターに送信されたメッセージは、停止する前に通常どおり処理されます。
アクターが停止を要求された後にアクターに送信されたメッセージは、停止後に pykka.ActorDeadError で応答されます。
アクターが再起動されない可能性があります。
ブロックとタイムアウトは、ask() と同じように機能します。
戻り値: pykka.Future、またはブロックしている場合はブール値の結果