Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么signal.pause()会阻止套接字断开?_Python_Sockets_Signals_Python Multiprocessing - Fatal编程技术网

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

Python 为什么signal.pause()会阻止套接字断开?,python,sockets,signals,python-multiprocessing,Python,Sockets,Signals,Python Multiprocessing,我正在使用Python 3.5和多处理模块处理套接字,并遇到了意外的行为。我的程序本质上是一对线程在运行,直到客户机收到某条消息,告诉它停止 如果我这样执行它,我会得到一个中断程序的BrokenPipeError,尽管while True循环和except块 #!/usr/bin/env python3 import signal import traceback from multiprocessing.dummy import Pool from process import Process

我正在使用Python 3.5和
多处理
模块处理套接字,并遇到了意外的行为。我的程序本质上是一对线程在运行,直到客户机收到某条消息,告诉它停止

如果我这样执行它,我会得到一个中断程序的
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()
根据,信号只能由主线程处理,但两个套接字都由次线程处理。
signal.pause()
在同一上下文中甚至没有调用套接字时,如何防止套接字断开?

如其名称所示,会立即返回。因此,在程序的第一个版本中,主线程在启动子线程时立即退出(虚拟进程仅为一个)

因此,主线程早在异常发生之前就退出了
try

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


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

顺便说一句,这是您的设计决定,但是如果您使用python3.5+,那么异步比python线程方便得多(无论是通过线程还是多处理api)。谢谢您的回答。但是,
traceback.print_exc()
会不会警告我套接字已断开,而不是悄无声息地失败?我删除了一些代码以使其更易于阅读,但这两个线程至少都会将关键异常写入日志文件。我甚至移动了
signal.pause();在
块下方返回0
,但
块除外,我仍然没有得到任何
断开管道错误
。这是否意味着没有套接字出现故障?这可能意味着它们没有出现故障是的。可以肯定的是,你可以故意让一个失败,你应该会看到异常。只是尝试了一下。事实上,它们并没有失败。我尝试用time.sleep()`替换
signal.pause()`并且我相信主线程在退出时正在关闭所有连接(可能是作为垃圾收集的一部分)。谢谢你的帮助,现在我知道这里需要修复什么了。