取消接受并关闭 Python 处理/多处理侦听器连接的正确方法

2023-12-26

(我正在使用py处理 http://developer.berlios.de/projects/pyprocessing在此示例中的模块,但是如果您运行,则用多处理替换处理可能应该可以工作蟒蛇2.6 http://docs.python.org/library/multiprocessing.html或使用多处理向后移植 http://code.google.com/p/python-multiprocessing/)

我目前有一个程序可以监听unix套接字(使用processing.connection.Listener),接受连接并生成一个处理请求的线程。在某个时刻,我想优雅地退出进程,但由于accept()调用被阻塞,我看不出有什么办法可以很好地取消它。我至少有一种方法可以在这里(OS X)工作,设置一个信号处理程序并从另一个线程向该进程发出信号,如下所示:

import processing
from processing.connection import Listener
import threading
import time
import os
import signal
import socket
import errno

# This is actually called by the connection handler.
def closeme():
    time.sleep(1)
    print 'Closing socket...'
    listener.close()
    os.kill(processing.currentProcess().getPid(), signal.SIGPIPE)

oldsig = signal.signal(signal.SIGPIPE, lambda s, f: None)

listener = Listener('/tmp/asdf', 'AF_UNIX')
# This is a thread that handles one already accepted connection, left out for brevity
threading.Thread(target=closeme).start()
print 'Accepting...'
try:
    listener.accept()
except socket.error, e:
    if e.args[0] != errno.EINTR:
        raise
# Cleanup here...
print 'Done...'

我考虑过的唯一其他方法是深入连接(listener._listener._socket)并设置非阻塞选项......但这可能会产生一些副作用,并且通常非常可怕。

有谁有更优雅(甚至可能是正确的!)的方法来实现这一点?它需要可移植到 OS X、Linux 和 BSD,但 Windows 可移植性等不是必需的。

澄清: 谢谢大家!像往常一样,我原来的问题中的歧义被揭示了:)

  • 我需要在取消监听后执行清理,并且我并不总是想实际退出该进程。
  • 我需要能够从不是从同一父进程生成的其他进程访问此进程,这使得队列变得笨拙
  • The reasons for threads are that:
    • 他们访问共享状态。实际上或多或少是一个常见的内存数据库,所以我想它可以以不同的方式完成。
    • 我必须能够同时接受多个连接,但实际线程大多数时候都在阻塞。每个接受的连接都会产生一个新线程;这是为了不阻止所有客户端的 I/O 操作。

关于线程与进程,我使用线程使阻塞操作变为非阻塞,并使用进程来启用多处理。


这不是 select 的用途吗?

仅当 select 表明它不会阻塞时才调用套接字上的 Accept...

select有超时时间,可以偶尔跳出来检查一下 如果是时候关闭的话......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

取消接受并关闭 Python 处理/多处理侦听器连接的正确方法 的相关文章

随机推荐