Асинхронный вызов метода в Python?

Переменная i является глобальным, значение которого равняется 2 каждый раз, функция f вызвана.

я был бы склонен реализовать поведение, которое Вы после следующим образом:

>>> class f:
...  def __init__(self, multiplier): self.multiplier = multiplier
...  def __call__(self, multiplicand): return self.multiplier*multiplicand
... 
>>> flist = [f(i) for i in range(3)]
>>> [g(2) for g in flist]
[0, 2, 4]

Ответ на Ваше обновление : это не глобальные из i по сути , который вызывает это поведение, это - то, что это - переменная от объема включения, который имеет фиксированное значение за времена, когда f называют. В Вашем втором примере значение i принято от объема эти kkk функция, и ничто не изменяет это, когда Вы вызываете функции на flist.

169
задан Peter Mortensen 31 October 2009 в 20:40
поделиться

4 ответа

Вы можете использовать модуль многопроцессорности , добавленный в Python 2.6. Вы можете использовать пулы процессов, а затем получать результаты асинхронно с помощью:

apply_async(func[, args[, kwds[, callback]]])

Например:

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=1)              # Start a worker processes.
    result = pool.apply_async(f, [10], callback) # Evaluate "f(10)" asynchronously calling callback when finished.

Это только одна альтернатива. Этот модуль предоставляет множество возможностей для достижения желаемого. Также из этого будет действительно легко сделать декоратор.

137
ответ дан 23 November 2019 в 20:49
поделиться

Что-то вроде:

import threading

thr = threading.Thread(target=foo, args=(), kwargs={})
thr.start() # Will run "foo"
....
thr.is_alive() # Will return whether foo is running currently
....
thr.join() # Will wait till "foo" is done

Подробнее см. В документации на https://docs.python.org/library/threading.html .

195
ответ дан 23 November 2019 в 20:49
поделиться

Есть ли причина не использовать потоки? Вы можете использовать класс threading . Вместо finished () используйте функцию isAlive () . Функция result () может join () поток и получить результат. И, если возможно, переопределите функции run () и __ init __ , чтобы вызвать функцию, указанную в конструкторе, и сохранить значение где-нибудь в экземпляре класса.

2
ответ дан 23 November 2019 в 20:49
поделиться

Это не в ядре языка, а в очень зрелой библиотеке, которая делает то, что вы хотите, - это Twisted . Он представляет объект Deferred, к которому вы можете прикреплять обратные вызовы или обработчики ошибок («errbacks»). Deferred - это, по сути, «обещание», что функция в конечном итоге даст результат.

30
ответ дан 23 November 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: