2012-07-08 25 views
0

是否有某种方法来关闭一个特定的挂接recv zmq套接字从Python中的另一个线程没有打破可能正在使用的其他套接字?以下代码似乎不会退出;更换sock.close()ctx.destroy()导致其退出,但显然会摧毁所有插座的情况下:从另一个线程关闭挂zmq套接字

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' 
+0

销毁上下文有时还会在控制台上打印“断言失败”消息。 – lebedov 2012-07-08 22:58:43

回答

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' 
+0

可以通过将信号处理程序链接到适当的信号并使用'os.kill(os.getpid(),signal_id)发送信号来使用其他信号' – lebedov 2012-07-09 02:22:52

相关问题