Потоки
Поток работает внутри процесса, имея доступ ко всему, что находится в процессе, —
это похоже на раздвоение личности. Модуль 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 заключается в том, что