【发布时间】:2010-09-26 08:07:33
【问题描述】:
(我在此示例中使用pyprocessing 模块,但如果您运行python 2.6 或使用multiprocessing backport,则用多处理替换处理可能会起作用)
我目前有一个程序可以侦听 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 可移植性等不是必需的。
说明: 谢谢大家!像往常一样,我原来的问题中的歧义被揭露了:)
- 我需要在取消侦听后执行清理,而且我并不总是想真正退出该进程。
- 我需要能够从不是从同一个父进程派生的其他进程访问此进程,这使得队列难以处理
- 线程的原因是:
- 他们访问共享状态。实际上或多或少是一个常见的内存数据库,所以我想它可以做得不同。
- 我必须能够同时接受多个连接,但实际线程大部分时间都处于阻塞状态。每个接受的连接都会产生一个新线程;这是为了不阻止 I/O 操作上的所有客户端。
关于线程与进程,我使用线程来使我的阻塞操作非阻塞,并使用进程来启用多处理。
【问题讨论】:
标签: python sockets multiprocessing