Eu queria saber se existe alguma biblioteca para chamadas de método assíncronas em Python . Seria ótimo se você pudesse fazer algo como
@async
def longComputation():
<code>
token = longComputation()
token.registerCallback(callback_function)
# alternative, polling
while not token.finished():
doSomethingElse()
if token.finished():
result = token.result()
Ou para chamar uma rotina não assíncrona de forma assíncrona
def longComputation()
<code>
token = asynccall(longComputation())
Seria ótimo ter uma estratégia mais refinada como nativa no núcleo do idioma. Isso foi considerado?
python
asynchronous
Stefano Borini
fonte
fonte
async
e brilhanteawait
sintaxe do 3.5).Respostas:
Você pode usar o módulo de multiprocessamento adicionado no Python 2.6. Você pode usar conjuntos de processos e obter resultados de forma assíncrona com:
Por exemplo:
Esta é apenas uma alternativa. Este módulo fornece muitas facilidades para alcançar o que você deseja. Também será muito fácil fazer um decorador com isso.
fonte
from multiprocessing.dummy import Pool
. multiprocessing.dummy tem o mesmo comportamento exato implementado ao longo de tópicos em vez de processosAlgo como:
Consulte a documentação em https://docs.python.org/library/threading.html para obter mais detalhes.
fonte
No Python 3.5, você pode usar geradores aprimorados para funções assíncronas.
Sintaxe aprimorada do gerador:
Nova
async/await
sintaxe:fonte
Não está no núcleo da linguagem, mas uma biblioteca muito madura que faz o que você quer é o Twisted . Ele apresenta o objeto Adiado, ao qual você pode anexar retornos de chamada ou manipuladores de erros ("errbacks"). Um diferido é basicamente uma "promessa" de que uma função terá um resultado eventualmente.
fonte
Você pode implementar um decorador para tornar suas funções assíncronas, embora isso seja um pouco complicado. O
multiprocessing
módulo está cheio de pequenas peculiaridades e restrições aparentemente arbitrárias - mais um motivo para encapsulá-lo atrás de uma interface amigável.O código abaixo ilustra o uso do decorador:
Em um caso do mundo real, eu elaboraria um pouco mais sobre o decorador, fornecendo uma maneira de desativá-lo para depuração (mantendo a interface futura no lugar) ou talvez um recurso para lidar com exceções; mas acho que isso demonstra o princípio suficientemente bem.
fonte
Somente
fonte
Você poderia usar o eventlet. Ele permite que você escreva o que parece ser um código síncrono, mas que ele opere de forma assíncrona na rede.
Aqui está um exemplo de um rastreador super mínimo:
fonte
Minha solução é:
E funciona exatamente como solicitado:
fonte
Algo assim funciona para mim, você pode chamar a função e ela será despachada para um novo thread.
fonte
Existe algum motivo para não usar threads? Você pode usar a
threading
classe Em vez dafinished()
função, use oisAlive()
. Aresult()
função poderiajoin()
encadear e recuperar o resultado. E, se puder, substitua as funçõesrun()
e__init__
para chamar a função especificada no construtor e salve o valor em algum lugar da instância da classe.fonte
Você pode usar concurrent.futures (adicionado no Python 3.2).
fonte
Você pode usar o processo. Se você deseja executá-lo para sempre, use enquanto (como rede) em sua função:
se você quiser executá-lo apenas uma vez, faça o seguinte:
fonte