为什么会这样信号暂停()防止插座断开?

2024-04-26 13:25:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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()如何防止它们中断?你知道吗


Tags: fromimportsignalmainsocketprocessthreadsender
1条回答
网友
1楼 · 发布于 2024-04-26 13:25:04

顾名思义,^{}会立即返回。因此,在程序的第一个版本中,主线程在启动子线程时立即退出(伪进程只是threads using the multiprocessing api)。你知道吗

因此,主线程早在异常发生之前就退出了try块。你知道吗

在第二种情况下,signal.pause()强制主线程在try块中等待,在那里它将捕获异常。你知道吗

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

相关问题 更多 >