python异步套接字编程

Posted

技术标签:

【中文标题】python异步套接字编程【英文标题】:python async socket programming 【发布时间】:2016-01-13 11:32:31 【问题描述】:

现在我有两个线程,线程 1 是主线程,线程 2 是任务线程。我需要线程 2 来处理所有的网络问题,所以我将所有套接字放在线程 2 中,并将它们设置为无阻塞。线程 1 用于将请求推送到线程 2 以完成工作。

一开始我是这样写的:

request_queue = Queue.Queue()
tasks = []
sockets = []

**thread 1:**

while True:

    get_user_input()
    #...
    request_queue.put(request_task)

**thread 2:**

while True:

    if have_requests(request_queue):

        t = create_task()

        tasks.append(t)

        sockets.append(t.socket())

    select(sockets,timeout=0) #no blocking select

    update_tasks()
    #...

显然,当没有请求和任务时,线程2会浪费cpu。我不想使用sleep(),因为当线程2处于睡眠状态时,它无法及时处理请求。那我想也许我应该将 request_queue 更改为本地主机套接字,如下所示:

request_queue = sock.sock()
request_queue.bind(local_host,some_port)
request_queue.listen()

**thread 1**

while True:

    get_user_input()

    request_queue.send(new_request)


**thread 2**

while True:

    select(sockets) # blocking select

    if request_queue is active:
        t = request_queue.recv()
        t = create_task(t)
        tasks.append(t)
        sockets.append(t.socket())

    #check other sockets
    #update tasks...

但这看起来有点棘手,我不知道这是否是一个好方法。我想要的是线程2可以及时处理请求,不要浪费cpu时间和同时处理套接字事件.有人可以帮忙吗?

【问题讨论】:

为什么 Thread2 不是简单的 consuming items 来自队列? (阻塞) 因为它从队列中创建任务项,然后它也会处理套接字事件。 【参考方案1】:

对于异步网络,请查看 Tornado、Twisted 或 Gevent。 this article 也可能对您有用。 Gevent 示例:

def handle_socket(sock):
    sock.sendall("payload")
    sock.close()

server = socket.socket()
server.bind(('0.0.0.0', 9999))
server.listen(500) # max connections
while True:
    try:
        new_sock, address = server.accept()
    except KeyboardInterrupt:
        break
    # handle every new connection with a new handler
    gevent.spawn(handle_socket, new_sock)

而Celery 最适合后台作业执行。

【讨论】:

我想做的更像是一个等待请求的线程池,而不是服务器。我稍后会读到。 是的,如果我正在编写服务器,那么这很好。但是现在,我需要服务器同时处理来自其他线程的新请求和异步套接字事件。顺便说一下,我使用的是 Python 2.7。

以上是关于python异步套接字编程的主要内容,如果未能解决你的问题,请参考以下文章

2017.07.12 Python网络编程之使用多路复用套接字I/O

python_11(网络编程)

在 Delphi 中进行异步套接字编程的惯用方法是啥?

套接字中没有可用数据时的异步编程模型

线程同步与异步套接字编程

使用异步套接字编程发送二进制数据并读取其值