我正在使用python3.5和multiprocessing
模块处理套接字,并遇到了意外的行为。我的程序本质上是一对线程在运行,直到客户机收到某个消息,告诉它停止。你知道吗
如果我这样执行,我会得到一个中断程序的BrokenPipeError
,尽管有while True
循环和except
块。你知道吗
#!/usr/bin/env python3
import signal
import traceback
from multiprocessing.dummy import Pool
from process import Process
def main():
while True:
try:
# a Process has a couple threads
process = Process()
listener_pool = Pool(processes=1)
sender_pool = Pool(processes=1)
# blocking socket client that runs forever
listener_pool.apply_async(process.listener_thread.run, ())
# blocking socket server that runs forever
sender_pool.apply_async(process.sender_thread.run, ())
return 0
except BrokenPipeError:
traceback.print_exc()
# closing connections
process.emitter_thread.socket.close()
process.listener_thread.socket.close()
if __name__ == '__main__':
main()
但是,当我在返回之前添加signal.pause()
时,不仅代码按预期运行,而且任何时候都不会引发BrokenPipeError
。你知道吗
#!/usr/bin/env python3
import signal
import traceback
from multiprocessing.dummy import Pool
from process import Process
def main():
while True:
try:
# a Process has a couple threads
process = Process()
listener_pool = Pool(processes=1)
sender_pool = Pool(processes=1)
# blocking socket client that runs forever
listener_pool.apply_async(process.listener_thread.run, ())
# blocking socket server that runs forever
sender_pool.apply_async(process.sender_thread.run, ())
signal.pause()
return 0
except BrokenPipeError:
traceback.print_exc()
# closing connections
process.emitter_thread.socket.close()
process.listener_thread.socket.close()
if __name__ == '__main__':
main()
根据docs,信号只能由主线程处理,但两个套接字都由次线程处理。当套接字甚至没有在同一上下文中被调用时,signal.pause()
如何防止它们中断?你知道吗
顾名思义,^{} 会立即返回。因此,在程序的第一个版本中,主线程在启动子线程时立即退出(伪进程只是threads using the multiprocessing api)。你知道吗
因此,主线程早在异常发生之前就退出了
try
块。你知道吗在第二种情况下,
signal.pause()
强制主线程在try
块中等待,在那里它将捕获异常。你知道吗但请注意,这是一个脆弱的解决方案,因为接收任何信号都会使
signal.pause()
恢复,并且主线程退出。你知道吗相关问题 更多 >
编程相关推荐