検索

ホームページ  >  に質問  >  本文

Python 协程的无限递归的问题

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,我想实现一个原始的方法。但是出错,不知道要实现无限递归的话,应该怎么写嘞?

PHP中文网PHP中文网2770日前840

全員に返信(4)返信します

  • 天蓬老师

    天蓬老师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
    ....

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 15:46:45

    あなたが書いたことには確かに何か問題がありますが、最も重要なことは、スタックレスは Python の修正バージョンであり、そのコルーチンは標準の CPython のコルーチンとは異なるようです。CPython で同様の関数を実装したい場合。 , greenletに基づいて行う必要がある場合があります。

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 15:46:45

    http://anandology.com/blog/using-iterators-and-generators/
    問題はジェネレーター自体を渡すことによって引き起こされるものであり、送信自体によって引き起こされるものであるはずです
    pi po がグローバル変数であれば問題ないはずです

    返事
    0
  • 迷茫

    迷茫2017-04-17 15:46:45

    ジェネレーターの使用法は明らかに間違っています。もちろん、send/next に再度アクセスすると、このエラーが報告されます。
    具体的に何を実現したいのかわかりませんが、「ピンポン」を交互に出力したい場合は、ジェネレーター

    を使用してください。

    返事
    0
  • キャンセル返事