Простой Python. Современный стиль программирования (Любанович) - страница 287

>127.0.0.1 — [02/Jun/2014 21:14:52] "POST / HTTP/1.1" 200 -

>Server sent 2014-06-03 02:14:57.304741

>127.0.0.1 — [02/Jun/2014 21:14:57] "POST / HTTP/1.1" 200 -

>Server sent 2014-06-03 02:15:02.310377

>127.0.0.1 — [02/Jun/2014 21:15:02] "POST / HTTP/1.1" 200 -

А так — первые три строки от клиента:

>Client received 2014-06-03 02:14:52.299122

>Client received 2014-06-03 02:14:57.304741

>Client received 2014-06-03 02:15:02.310377

4. Возможно, вы видели эпизод телесериала I Love Lucy, в котором Люси и Этель работают на шоколадной фабрике (это классика). Парочка стала отставать, когда линия конвейера, которая направляла к ним на обработку конфеты, начала работать еще быстрее. Напишите симуляцию, которая отправляет разные типы конфет в список Redis, и клиент Lucy, который делает блокирующие выталкивания из списка. Ей нужно 0,5 секунды, чтобы обработать одну конфету. Выведите на экран время и тип каждой конфеты, которую получит Lucy, а также количество необработанных конфет:

redis_choc_supply.py передает бесконечное количество конфет:

>import redis

>import random

>from time import sleep

>conn = redis.Redis()

>varieties = ['truffle', 'cherry', 'caramel', 'nougat']

>conveyor = 'chocolates'

>while True:

>····seconds = random.random()

>····sleep(seconds)

>····piece = random.choice(varieties)

>····conn.rpush(conveyor, piece)

redis_lucy.py может выглядеть так:

>import redis

>from datetime import datetime

>from time import sleep

>conn = redis.Redis()

>timeout = 10

>conveyor = 'chocolates'

>while True:

>····sleep(0.5)

>····msg = conn.blpop(conveyor, timeout)

>····remaining = conn.llen(conveyor)

>····if msg:

>········piece = msg[1]

>········print('Lucy got a', piece, 'at', datetime.utcnow(),

>········', only', remaining, 'left')

Запустите их в любом порядке. Поскольку Люси требуется полсекунды для обработки каждой конфеты и они появляются в среднем каждые полсекунды, это становится похоже на гонку. Чем раньше вы запустите конвейер, тем более сложной сделаете жизнь Люси:

>$ python redis_choc_supply.py&

>$ python redis_lucy.py

>Lucy got a b'nougat' at 2014-06-03 03:15:08.721169, only 4 left

>Lucy got a b'cherry' at 2014-06-03 03:15:09.222816, only 3 left

>Lucy got a b'truffle' at 2014-06-03 03:15:09.723691, only 5 left

>Lucy got a b'truffle' at 2014-06-03 03:15:10.225008, only 4 left

>Lucy got a b'cherry' at 2014-06-03 03:15:10.727107, only 4 left

>Lucy got a b'cherry' at 2014-06-03 03:15:11.228226, only 5 left

>Lucy got a b'cherry' at 2014-06-03 03:15:11.729735, only 4 left

>Lucy got a b'truffle' at 2014-06-03 03:15:12.230894, only 6 left

>Lucy got a b'caramel' at 2014-06-03 03:15:12.732777, only 7 left