1. ホーム
  2. python

zeromq: 無限待機を防ぐには?

2023-10-17 04:26:41

質問

私はZMQを始めたばかりです。私は、ワークフローがあるアプリを設計しています。

  1. 多数のクライアント (ランダムな PULL アドレスを持つ) の 1 つが 5555 でサーバーに要求を PUSH します。
  2. サーバはクライアントの PUSH を永遠に待ち続けます。1 つが来ると、ワーカープロセスはその特定のリクエストのために生成されます。そう、ワーカー プロセスは同時に存在することができるのです。
  3. そのプロセスがタスクを完了すると、その結果をクライアントに PUSH します。

PUSH/PULLアーキテクチャが向いているのではと思うのですが。お願い をお願いします。 をお願いします。


しかし、これらのシナリオをどのように処理すればよいのでしょうか。

  1. client_receiver.recv() は、サーバーが応答しない場合、無限に待ちます。
  2. は、クライアントはリクエストを送るかもしれませんが、直後に失敗します。そのため、ワーカープロセスは永遠に server_sender.send() で止まったままになります。

のようなものをどのようにセットアップすればよいのでしょうか? タイムアウト のようなものをPUSH/PULLモデルで設定するのでしょうか?


EDIT : user938949 さんのご指摘のおかげで、私は になりました。 を得たので、後学のためにそれを共有します。

どのように解決するのですか?

zeromq >= 3.0を使用している場合、RCVTIMEOソケットオプションを設定することができます。

client_receiver.RCVTIMEO = 1000 # in milliseconds

しかし、一般的にはポーラーを使用することができます。

poller = zmq.Poller()
poller.register(client_receiver, zmq.POLLIN) # POLLIN for recv, POLLOUT for send

そして poller.poll() はタイムアウトを取ります。

evts = poller.poll(1000) # wait *up to* one second for a message to arrive.

evts は、受信するものがなければ空リストとなります。

でポーリングすることができます。 zmq.POLLOUT で、送信に成功するかどうかを確認することができます。

あるいは、失敗したかもしれないピアのケースを処理するために、a:

worker.send(msg, zmq.NOBLOCK)

で十分かもしれません。これは常にすぐに返され、送信が完了しなかった場合は ZMQError(zmq.EAGAIN) を送出します。