zmq.Poller
を使用して、stdinのデータ可用性をポーリングすることはできますか?そうでない場合、zeromqソケットのデータ可用性のために、ある時間(理想的に)ポーリングするのが最も効率的な待ち時間は何ですか。& stdin?zeromq zmq.Poller&stdin
5
A
答えて
4
はい、zmqポーラー等STDIN、などのネイティブのFDを、サポートしていますので、あなただけのsys.stdin.fileno()
をチェックする必要があります。
poller = zmq.Poller()
poller.register(sys.stdin, zmq.POLLIN)
poller.register(mysocket, zmq.POLLIN)
evts = dict(poller.poll(1000))
stdin_ready = evts.get(sys.stdin.fileno(), False)
socket_ready = evts.get(mysocket, False)
1
あなたがWindows上で実行されることはありません確信している場合、あなたは、単にsys.stdin
を登録することができますzmq.Poller
(described by minrk, aboveとして)。
ただし、select()
implementation in Winsockはソケットのみをサポートしているため、標準入力のような「通常の」ファイル記述子のポーリングには使用できません。したがって、Windows上で実行する場合は、標準入力とinprocトランスポート上の0MQソケットをブリッジする必要があります。排他的な対ソケットを使用
推奨実装:
def forward_lines(stream, socket):
"""Read lines from `stream` and send them over `socket`."""
try:
line = stream.readline()
while line:
socket.send(line[:-1])
line = stream.readline()
socket.send('') # send "eof message".
finally:
# NOTE: `zmq.Context.term()` in the main thread will block until this
# socket is closed, so we can't run this function in daemon
# thread hoping that it will just close itself.
socket.close()
def forward_standard_input(context):
"""Start a thread that will bridge the standard input to a 0MQ socket and
return an exclusive pair socket from which you can read lines retrieved
from the standard input. You will receive a final empty line when the EOF
character is input to the keyboard."""
reader = context.socket(zmq.PAIR)
reader.connect('inproc://standard-input')
writer = context.socket(zmq.PAIR)
writer.bind('inproc://standard-input')
thread = threading.Thread(target=forward_lines,
args=(sys.stdin, writer))
thread.start()
return reader
if __name__ == '__main__':
context = zmq.Context()
reader = forward_standard_input(context)
poller = zmq.Poller()
poller.register(reader, zmq.POLLIN)
poller.register(...)
events = dict(poller.poll())
if events.get(reader, 0) & zmq.POLLIN:
line = reader.recv()
# process line.
if events.get(..., 0) & zmq.POLLIN:
# ...
関連する問題
- 1. Clojure&ZeroMQ
- 2. ZeroMQパイプラインパターン
- 3. JavaScriptクライアントのZeroMQ
- 4. C ZeroMQ zstr_recv hangs
- 5. zeromqとc#バインディング
- 6. ZeroMq recv not blocking
- 7. ZeroMQ JavaバインディングLD_LIBRARY_PATH
- 8. ZeroMQリンカエラーC++
- 9. ZeroMQ PUB/SUBバインドサブスクライバ
- 10. フラスコソケットとZeroMQ
- 11. 無効なソケットに接続するとPythonでZeromqがハングする
- 12. mod_wsgiとzeromqエラー(Python)
- 13. Zeromq Pussy/PULL in Django
- 14. ZeroMQ REQ/REP性能
- 15. ZeroMQコールバックfor Java/Scala
- 16. ZeroMQ vs Crossroads I/O
- 17. ZeroMQ vs Twisted vs Autobahn
- 18. Python:Postfix stdin
- 19. readChar stdin
- 20. デッドサーバでZeroMQを使用中にpythonスクリプトが終了する
- 21. ZeroMQの共通のlispバインディング
- 22. ZeroMQ - 複数のパブリッシャーとリスナー
- 23. juliaのZeroMQビルド問題
- 24. Node.js - NPMパッケージzmq vs zeromq
- 25. zeromq - ルータのディーラーパターンの利点
- 26. ZeroMQとは何ですか?
- 27. ZeroMQ + Protobufの代わりに
- 28. ZeroMQ:非同期返信
- 29. PHP加入者のZeroMQロストメッセージ
- 30. のpython3 asyncio ZeroMQ .connect()ブロック
+1:素晴らしいです。ありがとう! – jldupont
**警告**:これはWindowsでは動作しません(「アサーションに失敗しました:ソケットでないソケット操作」エラーが発生します)。これはおそらく、Windowsの 'select()'実装はソケット上でしか動作しないという事実に関連しています... –