Я недавно узнал, что звонит
time.sleep( X )
заблокирует GIL для
все время X и, следовательно, заморозить
ВСЕ темы Python за это время
период.
Вы ошиблись - это определенно не , как это работает. В каком источнике вы нашли эту неверную информацию?
В любом случае, тогда вы уточняете (в комментариях - лучше отредактируйте свой Q!), Что вы используете deferToThread
и ваша проблема с этим заключается в том, что ...:
Ну да, я откладываю действие на
нить и дать крутой обратный вызов.
Но родительский поток должен ждать
для всей серии суб тем
завершить, прежде чем он может перейти на новый
набор подпотоков для порождения
Так что используйте в качестве обратного вызова метод объекта со счетчиком - начните его с 0, увеличивайте его на единицу каждый раз, когда вы переносите поток, и уменьшайте на единицу в методе обратного вызова.
Когда метод обратного вызова видит, что уменьшенный счетчик вернулся к 0, он знает, что мы закончили "завершать всю серию подпотоков", а затем пришло время "перейти к новому set of sub threads to spawn "и, таким образом, только в этом случае вызывает функцию или метод" spawn a new set of sub threads "- это так просто!
например. (за исключением опечаток и c, поскольку это непроверенный код, просто чтобы дать вам представление) ...:
class Waiter(object):
def __init__(self, what_next, *a, **k):
self.counter = 0
self.what_next = what_next
self.a = a
self.k = k
def one_more(self):
self.counter += 1
def do_wait(self, *dont_care):
self.counter -= 1
if self.counter == 0:
self.what_next(*self.a, **self.k)
def spawn_one_thread(waiter, long_calculation, *a, **k):
waiter.one_more()
d = threads.deferToThread(long_calculation, *a, **k)
d.addCallback(waiter.do_wait)
def spawn_all(waiter, list_of_lists_of_functions_args_and_kwds):
if not list_of_lists_of_functions_args_and_kwds:
return
if waiter is None:
waiter=Waiter(spawn_all, list_of_lists_of_functions_args_and_kwds)
this_time = list_of_list_of_functions_args_and_kwds.pop(0)
for f, a, k in this_time:
spawn_one_thread(waiter, f, *a, **k)
def start_it_all(list_of_lists_of_functions_args_and_kwds):
spawn_all(None, list_of_lists_of_functions_args_and_kwds)