Client received 2014-06-03 02:15:02.310377
4. Возможно, вы видели эпизод телесериала I Love Lucy, в котором Люси и Этель
работают на шоколадной фабрике (это классика). Парочка стала отставать,
когда линия конвейера, которая направляла к ним на обработку конфеты, на-
чала работать еще быстрее. Напишите симуляцию, которая отправляет разные
типы конфет в список Redis, и клиент Lucy, который делает блокирующие вы-
Глава 11. Конкуренция и сети
469
талкивания из списка. Ей нужно 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