2012-07-08 23 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

相關問題