【发布时间】:2019-05-30 20:23:24
【问题描述】:
我有一个在 2 个线程上运行的程序。主线程自己工作,另一个线程在 UDP 套接字上不断调用recv()。
基本上,代码结构是这样的:
done = False
def run_sock():
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('localhost', 12345))
while not done: # receive data until work done
data = sock.recv(1500)
print(data)
sock.close()
thread = threading.Thread(target=run_sock, daemon=True)
thread.start()
# Main thread
while not done:
... # Do work here
if some_condition: # Stop running, thread should as well
done = True
thread.join()
我想在主线程将done 更改为True 时关闭套接字,但是当这种情况发生时,套接字仍处于其当前阻塞recv 调用中,它必须在最终停止之前接收另一条消息.
有没有办法优雅地关闭套接字(无需处理错误)?我试过sock.shutdown(socket.SHUT_RDWR)、sock.setblocking(False),但它们都会引发错误。
【问题讨论】:
-
miiiiight 想使用互斥锁或类似的线程安全结构在线程之间进行通信
-
@Will 这只是我目前正在研究的一个过于简化的版本。我不想要任何冗余代码,因为我认为线程安全不是这里的问题
-
sock.recv(1500) 如果它没有获取数据应该永远阻塞,所以
done永远不会被检查并且 sock.close() 永远不会被调用 -
是的,这就是我的问题所在。