当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《取消接受和关闭Python处理/多处理侦听器连接的正确方法》经验,为你挑选了0个好方法。

(我在这个例子中使用了pyprocessing模块,但是如果你运行python 2.6或使用多处理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操作上的所有客户端.

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

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有