Асинхронный вызов метода в Python? - PullRequest
163 голосов
/ 06 августа 2009

Мне было интересно, есть ли какая-нибудь библиотека для асинхронных вызовов методов в Python . Было бы здорово, если бы вы могли сделать что-то вроде

@async
def longComputation():
    <code>


token = longComputation()
token.registerCallback(callback_function)
# alternative, polling
while not token.finished():
    doSomethingElse()
    if token.finished():
        result = token.result()

Или для асинхронного вызова не асинхронной процедуры

def longComputation()
    <code>

token = asynccall(longComputation())

Было бы замечательно иметь более утонченную стратегию в качестве родной для языкового ядра. Было ли это учтено?

Ответы [ 12 ]

2 голосов
/ 06 августа 2009

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

0 голосов
/ 20 апреля 2018

Вы можете использовать процесс. Если вы хотите запустить его навсегда, используйте в то время (как сеть) в вашей функции:

from multiprocessing import Process
def foo():
    while 1:
        # Do something

p = Process(target = foo)
p.start()

если вы хотите запустить его один раз, сделайте так:

from multiprocessing import Process
def foo():
    # Do something

p = Process(target = foo)
p.start()
p.join()
...