1

使用中の可能性のある他のソケットを壊すことなく、Python の別のスレッドから特定のぶら下がっている recv zmq ソケットを閉じる方法はありますか? 次のコードは終了していないようです。をに置き換えるsock.close()ctx.destroy()終了しますが、コンテキスト内のすべてのソケットが明らかに破棄されます。

import zmq
import time
import threading as th
ctx = zmq.Context()
sock = ctx.socket(zmq.ROUTER)
sock.bind('tcp://*:6000')
def shutdown():
    time.sleep(5)
    print 'closing'
    sock.close()
t = th.Thread(target=shutdown)
t.start()
try:
    sock.recv()
except zmq.ZMQError:
print 'closed'
4

1 に答える 1

2

1 つの可能性は、シグナルが検出されたときに例外を発生させるシグナル ハンドラーを使用してソケットをシャットダウンするコンテキスト マネージャー内でソケット操作を実行することです。

import zmq
import signal, time
import threading as th
from contextlib import contextmanager
@contextmanager
def ZMQErrorOnAlarm():
    def handler(signum, frame):
        raise Exception('ALARM detected')
    signal.signal(signal.SIGALRM, handler)
    yield
ctx = zmq.Context()
sock = ctx.socket(zmq.ROUTER)
sock.bind('tcp://*:6000')
def shutdown():
    signal.alarm(5)
    print 'closing'
t = th.Thread(target=shutdown)
t.start()
with ZMQErrorOnAlarm():
    try:
        sock.send('x')
        sock.recv()
    except:
        print 'closed'
于 2012-07-09T02:03:52.957 に答える