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

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

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