hi, 最近看了关于Python协程的相关文章协程的简单理解,说协程可以无限递归,于是想写一个协程示例练练,于是:
import time
def ping():
print 'ping 0'
count = 1
try:
pi,po = yield s
print 'ping ' + str(count)
count += 1
time.sleep(1)
po.send([po, pi])
except StopIteration:
pass
def pong():
print 'pong 0'
count = 1
try:
po, pi = yield s
print 'pong ' + str(count)
count += 1
time.sleep(1)
pi.send([pi,po])
except StopIteration:
pass
s = ping()
r = pong()
s.next()
r.next()
s.send([s,r])
运行结果是:
ping 0
pong 0
ping 1
pong 1
Traceback (most recent call last):
File "D:\test\coroutine.py", line 34, in <module>
s.send([s,r])
File "D:\test\coroutine.py", line 12, in ping
po.send([po, pi])
File "D:\test\coroutine.py", line 25, in pong
pi.send([pi,po])
ValueError: generator already executing
那篇文章使用了stackless,我想实现一个原始的方法。但是出错,不知道要实现无限递归的话,应该怎么写嘞?
天蓬老师2017-04-17 15:46:45
必要なのは、run 関数を使用してコルーチンを管理することです。
ping 関数と pong 関数の内部では、yield returns run が実行されます。
run 関数で、next() を使用してコルーチンをスケジュールします。
実行結果:
ピン 0
ポン 0
ピン 1
ポン 1
ピン 2
ポン 2
ピン 3
ポン 3
ピン 4
ポン 4
…………
=========================================== === =========
メッセージングバージョンあり:
実行結果:
ping 0
pong 0
ping run からメッセージを取得
ping 1
pong ping からメッセージを取得
pong 1
ping pong からメッセージを取得
ping 2
ポン ping
ポン 2
ping ポンからメッセージを取得
ping 3
ポン ping
ポン 3
ping ポンからメッセージを取得
ping 4
....
PHP中文网2017-04-17 15:46:45
あなたが書いたことには確かに何か問題がありますが、最も重要なことは、スタックレスは Python の修正バージョンであり、そのコルーチンは標準の CPython のコルーチンとは異なるようです。CPython で同様の関数を実装したい場合。 , greenletに基づいて行う必要がある場合があります。
高洛峰2017-04-17 15:46:45
http://anandology.com/blog/using-iterators-and-generators/
問題はジェネレーター自体を渡すことによって引き起こされるものであり、送信自体によって引き起こされるものであるはずです
pi po がグローバル変数であれば問題ないはずです
迷茫2017-04-17 15:46:45
ジェネレーターの使用法は明らかに間違っています。もちろん、send/next に再度アクセスすると、このエラーが報告されます。
具体的に何を実現したいのかわかりませんが、「ピンポン」を交互に出力したい場合は、ジェネレーター