asyncore - Асинхронный обработчик сокетов
asyncore - модуль предназначенный для работы с неблокирующими сокетами.
Неблокирующие сокеты (nonblocking sockets) - это сокеты на время выполнения операции с которыми клиентская программа не блокируется, те например не ожидает завершения операции получения данных, а идет дальше. Вместо того чтобы вызывать обработку данных сразу после прослушивания сокета, вы делаете коллбэк который будет вызван когда сокет будет готов передать или принять данные.
Пример простой отправки стандартного GET запроса на получение страницы.
1 import asyncore, socket
2
3 class http_client(asyncore.dispatcher):
4
5 def __init__(self, host, path):
6 asyncore.dispatcher.__init__(self)
7 self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
8 self.connect( (host, 80) )
9 self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path
10 self.host = host
11
12 def handle_connect(self):
13 pass
14
15 def handle_close(self):
16 self.close()
17
18 #автоматически вызывается когда в сокет приходят данные
19 #тут мы выведем хост с откуда они идут, и сделаем стандартное чтение с сокета
20 def handle_read(self):
21 print self.host
22 self.recv(8192)
23 #print self.recv(8192)
24
25 #этот метод сигнал о том что сокет готов записывать
26 def writable(self):
27 return (len(self.buffer) > 0)
28
29 def handle_write(self):
30 sent = self.send(self.buffer)
31 self.buffer = self.buffer[sent:]
32
33 c = http_client('www.mail.ru', '/')
34 c = http_client('www.python.org', '/')
35
36 #запускаем цикл опроса сокетов
37 asyncore.loop()
Рузультат:
www.mail.ru www.mail.ru www.mail.ru www.mail.ru www.mail.ru www.python.org www.python.org www.mail.ru www.mail.ru www.mail.ru