Advertisement
Infidelis

async socket

Mar 4th, 2020
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.64 KB | None | 0 0
  1. import socket
  2. from select import select
  3.  
  4. # select = selectors.DefaultSelector()
  5. to_read = {}
  6. to_write = {}
  7. tasks = []
  8.  
  9.  
  10. def server():
  11.     server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  12.     server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  13.     server_socket.bind(("localhost", 5000))
  14.     server_socket.listen()
  15.  
  16.     while True:
  17.         yield ("read", server_socket)
  18.         client_socket, addr = server_socket.accept()
  19.         print("Connected client", addr)
  20.         tasks.append(client(client_socket))
  21.  
  22.  
  23. def client(client_socket):
  24.     while True:
  25.         yield ("read", client_socket)
  26.         request = client_socket.recv(4096)
  27.  
  28.         if not request:
  29.             break
  30.         else:
  31.             yield ("write", client_socket)
  32.             response = "Hello world\n".encode()
  33.             client_socket.send(response)
  34.  
  35.     print("Outside from an inner loop")
  36.     client_socket.close()
  37.  
  38.  
  39. def event_loop():
  40.     while any([tasks, to_read, to_write]):
  41.  
  42.         while not tasks:
  43.             ready_to_read, ready_to_write, _ = select(to_read, to_write, [])
  44.             for sock in ready_to_read:
  45.                 tasks.append(to_read.pop(sock))
  46.             for sock in ready_to_write:
  47.                 tasks.append(to_write.pop(sock))
  48.         try:
  49.             task = tasks.pop(0)
  50.             reason, sock = next(task)
  51.  
  52.             if reason == "read":
  53.                 to_read[sock] = task
  54.             if reason == "write":
  55.                 to_write[sock] = task
  56.         except StopIteration:
  57.             print("all done")
  58.  
  59.  
  60. if __name__ == "__main__":
  61.     tasks.append(server())
  62.     event_loop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement