gpt4 book ai didi

python - 为什么 signal.pause() 会阻止套接字断开?

转载 作者:太空宇宙 更新时间:2023-11-04 02:24:21 25 4
gpt4 key购买 nike

我在使用 Python 3.5 和 multiprocessing 模块处理套接字时遇到了意外行为。我的程序本质上是几个线程运行,直到客户端收到一条告诉它停止的特定消息。

如果我这样执行它,我会得到一个中断程序的 BrokenPipeError,尽管有 while True 循环和 except block 。

#!/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() 做了什么来防止套接字中断,甚至没有在同一上下文中调用它们?

最佳答案

apply_async ,顾名思义,立即返回。因此,在程序的第一个版本中,主线程在启动子线程时立即退出(虚拟进程只是 threads using the multiprocessing api )。

因此主线程在异常发生之前很久就退出了try block 。

在第二种情况下,signal.pause() 强制主线程在 try block 中等待,它将捕获异常。

请注意,这是一个脆弱的解决方案,因为接收到任何信号都会使 signal.pause() 恢复并退出主线程。

关于python - 为什么 signal.pause() 会阻止套接字断开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50826409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com