Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.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
Python3套接字/选择器注册多个事件_Python_Sockets_Selector - Fatal编程技术网

Python3套接字/选择器注册多个事件

Python3套接字/选择器注册多个事件,python,sockets,selector,Python,Sockets,Selector,到目前为止,我一直在使用阻塞/同步套接字,因为我意识到在执行IO时,非阻塞/异步套接字可能会更强大 因此,首先,我决定做一个简单的项目,创建一个非阻塞套接字,在设置事件时能够读写,所以我基本上在选择器中注册事件,然后进入一个无休止的循环等待事件,当设置事件时,我回调它们 import socket import selectors sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setblocking(False) s

到目前为止,我一直在使用阻塞/同步套接字,因为我意识到在执行IO时,非阻塞/异步套接字可能会更强大

因此,首先,我决定做一个简单的项目,创建一个非阻塞套接字,在设置事件时能够读写,所以我基本上在选择器中注册事件,然后进入一个无休止的循环等待事件,当设置事件时,我回调它们

import socket
import selectors

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(False)
selector = selectors.DefaultSelector()

def write():
    print('Able to Write')
    sock.send(b'Hello')
    #I don't want to keep sending data, so I don't re-register the event

def read():
    print('Able to Read')
    data = sock.recv(1024).decode()
    selector.register(sock.fileno(), selectors.EVENT_READ, read) 
    # I register the event again because I'd like to keep reading from the socket.

# I don't use events here...
try:
    sock.connect(('localhost', 80))
except BlockingIOError:
    pass

# I register read and write events with their respective callbacks. Error is raised...
selector.register(sock.fileno(), selectors.EVENT_READ, read)
selector.register(sock.fileno(), selectors.EVENT_WRITE, write)

while True:
    events = selector.select()
    for key, _ in events:
        callback = key.data
        callback()
        selector.unregister(key.fileobj)
        #Unregister the event
这是我的代码。

我的目标是能够异步读写,因此我的想法是在同一个套接字上注册许多读写事件。

必须同时注册所有事件

selector.register(sock.fileno(),selectors.EVENT_WRITE | selectors.EVENT_READ,WRITE)

使用按位OR的。请注意,在read()中也会遇到同样的问题,因为在调用回调之前没有注销FD