Выполнение длинных блокирующих вычислений параллельно в витой - PullRequest
1 голос
/ 21 июня 2019

пытаюсь выучить витую рамку. Но я не могу справиться с этим.

Скажи, у меня есть эта функция.

def long_blocking_call(arg1, arg2):
     # do something
     time.sleep(5) # simulate blocking call
     return result

results = []
for k, v in args.iteritems():
      r = long_blocking_call(k,v)
      results.append(r)

Но мне было интересно, как я могу использовать deferToThread (или что-то еще в витом мире) для запуска long_blocking_call в «параллельной»

Я нашел этот пример: Периодически вызывайте deferToThread Но я не совсем уверен, что это работает параллельно?

1 Ответ

2 голосов
/ 21 июня 2019

deferToThread использует встроенную поддержку потоков Python для запуска функции, переданной ему в отдельном потоке (из пула потоков).

Так что deferToThread имеет все те же свойства, что и встроенная- в поточном модуле, когда дело доходит до параллелизма.На CPython потоки могут работать параллельно, если только один из них удерживает глобальную блокировку интерпретатора.

Поскольку универсальной причины "блокировки" не существует, универсального решения также не существует.на «блокирование» - так что невозможно сказать, приведет ли deferToThread к параллельному выполнению или нет вообще.Однако общее практическое правило заключается в том, что если блокировка происходит из-за ввода-вывода, она, вероятно, будет, а если из-за вычислений, вероятно, не будет.

Конечно, если это происходит из-за ввода-вывода, выможет быть лучше использовать другую функцию из Twisted вместо многопоточности.

...