Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.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

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异步套接字编程_Python_Sockets_Asyncsocket - Fatal编程技术网

python异步套接字编程

python异步套接字编程,python,sockets,asyncsocket,Python,Sockets,Asyncsocket,现在我有两个线程,线程1是主线程,线程2是任务线程。我需要线程2来处理所有的网络问题,所以我把所有的套接字放在线程2中,并将它们设置为无阻塞。线程1用于将请求推送到线程2以执行该作业 起初我写了这样的东西: request_queue = Queue.Queue() tasks = [] sockets = [] **thread 1:** while True: get_user_input() #... request_queue.put(request_tas

现在我有两个线程,线程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()
    #...
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。我不想使用sleep(),因为当线程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()
    #...
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时间,同时处理套接字事件。有人可以帮忙吗?

有关异步网络,请参阅,或。也可能对你有用。 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)

并且最适合后台作业执行。

为什么Thread2不直接从队列中删除?(阻塞),因为它从队列创建任务项,然后它也将处理套接字事件。我想做的更像是一个线程池等待请求,而不是服务器。稍后我会读到。是的,如果我正在写一个服务器,那么这很好。但是现在,我需要服务器同时处理来自其他线程和异步套接字事件的新请求。