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

примеров.

Потоки

Поток работает внутри процесса, имея доступ ко всему, что находится в процессе, —

это похоже на раздвоение личности. Модуль multiprocessing имеет кузена по име-

ни threading, который использует потоки вместо процессов (на самом деле модуль

multiprocessing был разработан позже своего собрата, основанного на процессах).

Переделаем наш пример с процессами для использования потоков:

import threading

def do_this(what):

whoami(what)

def whoami(what):

print("Thread %s says: %s" % (threading.current_thread(), what))

if __name__ == "__main__":

whoami("I'm the main program")

for n in range(4):

p = threading.Thread(target=do_this,

args=("I'm function %s" % n,))

p.start()

Вот что я вижу на своем экране:

Thread <_MainThread(MainThread, started 140735207346960)> says: I'm the main

program

Thread <Thread(Thread-1, started 4326629376)> says: I'm function 0

Thread <Thread(Thread-2, started 4342157312)> says: I'm function 1

Thread <Thread(Thread-3, started 4347412480)> says: I'm function 2

Thread <Thread(Thread-4, started 4342157312)> says: I'm function 3

Мы можем воссоздать пример о посуде, основанный на процессах, с помощью

потоков:

import threading, queue

import time

def washer(dishes, dish_queue):

for dish in dishes:

print ("Washing", dish)

time.sleep(5)

dish_queue.put(dish)

def dryer(dish_queue):

while True:

dish = dish_queue.get()

print ("Drying", dish)

time.sleep(10)

Конкуренция

307

dish_queue.task_done()

dish_queue = queue.Queue()

for n in range(2):

dryer_thread = threading.Thread(target=dryer, args=(dish_queue,))

dryer_thread.start()

dishes = ['salad', 'bread', 'entree', 'desert']

washer(dishes, dish_queue)

dish_queue.join()

Различие между модулями multiprocessing и threading заключается в том, что