Предположим, что есть синхронная функция в программе на Python с витым питанием, выполнение которой занимает много времени, выполняя это во многих работах разумного размера. Если бы функция могла возвращать отложенные значения, это было бы не сложно, однако функция оказалась глубоко внутри некоторого синхронного кода, так что возврат отложенных отложений невозможен.

Есть ли способ позволить витой обрабатывать выдающиеся события, не выходя из этой функции? То есть что я хочу сделать, это что-то вроде

def my_func():
    results = []
    for item in a_lot_of_items():
        results.append(do_computation(item))
        reactor.process_outstanding_events()
    return results

Конечно, это накладывает требования на повторный доступ к коду, но все же есть QCoreApplication.processEvents для этого в Qt есть что-нибудь в витой?

0
immerrr 8 Дек 2016 в 18:10

3 ответа

Проблема в том, что если do_heavy_computation() код, который блокирует, то выполнение не перейдет к следующей функции. В этом случае используйте deferToThread или blockingCallFromThread для тяжелых вычислений. Также, если вам не нужны результаты расчета, вы можете использовать callInThread. Ознакомьтесь с документацией по потокам

0
notorious.no 9 Дек 2016 в 12:33

Вы можете использовать deferToThread.

http://twistedmatrix.com/documents/13.2.0/core/howto/threading.html

Этот метод выполняет ваши вычисления в отдельном потоке и возвращает отложенный метод, который вызывается обратно, когда вычисление фактически завершено.

0
Markus W. 8 Дек 2016 в 15:27

Это должно сделать:

for item in items:
    reactor.callLater(0, heavy_func, item)

Реактор.callLater должен вернуть вас в цикл событий.

0
Markus W. 10 Дек 2016 в 19:19