2

私の場合を説明するために、この最小限のコードを書きました。

import threading
import time
import eventlet

eventlet.monkey_patch()

def printing_function():
    while True:
        # here i want to do some work
        print "printing"
        time.sleep(1)

if __name__ == '__main__':
    thread = threading.Thread(target=printing_function)
    thread.start()

    while True:
        # here i want to wait for users input
        raw_input("raw input\n")
        print "inside main loop"
        time.sleep(1)

2 つのスレッドがあっても、raw_input を呼び出すと両方ともブロックされます。eventlet.monkey_patch() をコメントアウトすると、1 つのスレッドのみがブロックされ、別のスレッドが「印刷」を続けます。なぜ、どうすればいいのですか?

4

1 に答える 1

2

ここで注意すべき点がいくつかあると思います。

  • raw_inputによってパッチが適用されていないeventletため、その呼び出しはブロックされています
  • threadingによってパッチが適用されeventletているため、スレッドはコルーチンとして機能しています

これを回避する 1 つの方法はthreading、スレッドが実際のスレッドになるように、パッチを適用しないことです。そのためには、以下を置き換えるだけです。

eventlet.monkey_patch()

と:

eventlet.monkey_patch(os=True,
                     select=True,
                     socket=True,
                     thread=False,
                     time=True)

次のモジュールにパッチが適用さthreadれる時期に注意してください: 、、。TruethreadthreadingQueue

threading編集:パッチを適用して非同期にしたい場合raw_inputは、次の実装をお勧めします:

def raw_input(message):
    sys.stdout.write(message)

    select.select([sys.stdin], [], [])
    return sys.stdin.readline()

sys.stdinこれは、読み取りの準備ができているかどうかを確認するためにポーリングします。そうでない場合は、イベントレットに制御を渡して、他のコルーチンを実行させます。

于 2012-01-27T09:12:14.257 に答える