Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 242

Глава 11. Конкуренция и сети

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 используется как база данных. Здесь же мы рассмотрим ту его