self.transport.write(response)
else:
self.transport.loseConnection()
reactor.stop()
class KnockFactory(protocol.ClientFactory):
protocol = KnockClient
def main():
f = KnockFactory()
reactor.connectTCP("localhost", 8000, f)
reactor.run()
if __name__ == '__main__':
main()
Сначала запустим сервер:
$ python2 knock_server.py
Потом — клиент:
$ python2 knock_client.py
Сервер и клиент обмениваются сообщениями, и сервер выводит весь диалог:
Client: Knock knock
Server: Who's there?
Client: Disappearing client
Server: Disappearing client who?
Наш клиент-шутник завершает работу, оставляя сервер ждать ударной реп-
лики.
Если вы хотите забраться в дебри, попробуйте запустить другие примеры из его
документации.
asyncio
Недавно Гвидо ван Россум (помните его?) начал заниматься проблемой конкурен-
ции в Python. У многих пакетов был собственный цикл событий, и каждый из них
хотел быть единственным. Как могут примириться механизмы вроде функций об-
ратного вызова, зеленых потоков и др.? После продолжительных дискуссий он
предложил решение: модуль asyncio (от Asynchronous IO Support Rebooted — асин-
хронная поддержка ввода-вывода, http://bit.ly/pep-3156) под кодовым именем Tulip.
Он появился в Python 3.4 под именем asyncio. Теперь же он предлагает цикл со-
бытий, который совместим с twisted, gevent и другими асинхронными методами.
Цель его создания заключается в том, чтобы предоставить стандартный, чистый,
отлаженный асинхронный API. Вы сможете наблюдать за тем, как он расширяется,
в будущих релизах Python.
Конкуренция
313
Redis
Приведенные раньше примеры кода о мытье посуды, где использовались процессы
или потоки, запускались на одной машине. Рассмотрим еще один подход к реали-
зации очередей, которые могут запускаться на одной машине или во всей сети.
Даже несмотря на наличие нескольких процессов и/или потоков, иногда одной
машины недостаточно. Вы можете считать этот раздел мостиком между конкурен-
цией на одной машине и конкуренцией на нескольких машинах.
Чтобы запустить примеры из этого раздела, вам нужен сервер Redis и его модуль
для Python. Чтобы узнать, как их скачать, обратитесь к разделу «Redis» главы 8.
В этой главе Redis используется как база данных. Здесь же мы рассмотрим ту его