[python] 파이썬에서 비동기 메서드 호출?



Answers

같은 것 :

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/2/library/threading.html#module-threading 의 설명서를 https://docs.python.org/2/library/threading.html#module-threading 하십시오. 이 코드는 Python 3에서도 작동해야합니다.

Question

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())

언어 핵심에서보다 세련된 전략을 원한다면 좋을 것입니다. 이것이 고려 되었습니까?




프로세스를 사용할 수 있습니다. 영원히 (네트워킹과 같은) 사용하는 동안 그것을 사용하려면 다음과 같이하십시오.

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()



그것은 언어 중심이 아니지만, 당신이 원하는 것을하는 매우 성숙한 라이브러리는 Twisted 입니다. 콜백 또는 오류 처리기 ( "errbacks")를 연결할 수있는 Deferred 개체를 소개합니다. Deferred는 기본적으로 함수가 결국 결과를 가져 오는 "약속"입니다.




스레드를 사용하지 않는 이유가 있습니까? threading 클래스를 사용할 수 있습니다. finished() 함수 대신 isAlive() 사용하십시오. result() 함수는 스레드를 join() 하여 결과를 검색 할 수 있습니다. 그리고 가능한 경우 run()__init__ 함수를 재정의하여 생성자에 지정된 함수를 호출하고 클래스의 인스턴스에 값을 저장하십시오.




다만

import threading, time

def f():
    print "f started"
    time.sleep(3)
    print "f finished"

threading.Thread(target=f).start()



eventlet을 사용할 수 있습니다. 동기식 코드 인 것처럼 보이지만 네트워크를 통해 비동기 적으로 작동하도록 작성할 수 있습니다.

다음은 최소 최소 크롤러의 예입니다.

urls = ["http://www.google.com/intl/en_ALL/images/logo.gif",
     "https://wiki.secondlife.com/w/images/secondlife.jpg",
     "http://us.i1.yimg.com/us.yimg.com/i/ww/beta/y3.gif"]

import eventlet
from eventlet.green import urllib2

def fetch(url):

  return urllib2.urlopen(url).read()

pool = eventlet.GreenPool()

for body in pool.imap(fetch, urls):
  print "got body", len(body)



Links