다음 Python 코드가 있습니다.
>>> import gevent
>>> from gevent import monkey; monkey.patch_all()
>>>
>>> def fooFn(k):
... return 'gevent_'+k
...
>>> threads = []
>>> threads.append(gevent.spawn(fooFn,'0'))
>>> threads.append(gevent.spawn(fooFn,'1'))
>>>
>>> gevent.joinall([threads[1]])
>>>
>>> print threads[1].value
gevent_1
>>> print threads[0].value
gevent_0
>>>
위에서 볼 수 있듯이 threads[0].value
로부터 적절한 값을 얻었다 fooFn
. 이것은 threads[0]
그린 렛이 실행되었음을 의미합니다 .
내가 threads[1]
그린 렛 만 전달했을 때 왜 이런 일이 발생 gevent.joinall
했습니까?
실제로 전달 된 그린 렛 만 실행되도록하려면 gevent.joinall
어떻게 해야 합니까?
전화를 걸면 즉시 그린 렛이 예약 됩니다 greenlet.spawn()
. 즉,을 (를) 호출하면 즉시 생성되고 시작됩니다 spawn()
. 이것이 첫 번째 그린 렛이 실행을 마친 이유입니다. 두 그린 렛이 스폰 된 순간부터 실행 중이었고, 그린 렛 1의 결과를 찾을 때까지 둘 다 실행이 완료되었습니다.
gevent.joinall()
그린 렛을 실행하지 않습니다 spawn
. 매개 변수로 전달 된 스레드가 실행을 마칠 때까지 기다리 도록 주 스레드 (실제로이를 편집 한 스레드)에게만 알립니다 . 호출하지 않으면 joinall
그린 렛의 결과에 joinall()
도달 하기 전에 메인 스레드가 종료되고 종료 될 위험이 있습니다. 그러면 누가 결과를 처리할까요?
여기에서 gevents
원하는대로 작동하는지 확인하기 위해 변경해야하는 두 가지 작업을 수행했습니다 .
joinall()
스크립트가 아닌 콘솔 REPL에서 호출 했습니다.
여기서 메인 스레드 인 REPL 은 그린 렛이 반환되기 전에 끝나지 않는 것이 보장 됩니다. REPL exit()
은 EOF 를 호출 하거나 표시 할 때만 종료되기 때문 입니다. 그러나 즉각적인 사용자 상호 작용이없는 스크립트에서는 그다지 사치스럽지 않습니다. 스크립트에 수행 할 작업이 없으면 실행이 종료됩니다. 그렇기 때문에 join()
메인 스레드가 절대 종료되지 않고 부모가 돌아 가지 않도록 그린 렛을 남겨 두도록 호출합니다.
joinall()
콘솔 에서 호출 할 필요가 없습니다 (다음에 그린 렛에서 함수를 호출 할 때 그린 렛에서 결과를 얻을 수 있다는 보장을 원한다면, 좋은 생각입니다)
spawn()
greenlet 2가 실행되지 않는 동안 greenlet 1 만 실행되도록 보장하려면 호출 하지 않아야합니다. 대신 문서가 말하는 내용을 읽으십시오 .
새 greenlet을 시작하려면 대상 함수와 해당 인수를 Greenlet 생성자에 전달하고 start ()를 호출합니다.
>>> g = Greenlet(myfunction, 'arg1', 'arg2', kwarg1=1)
>>> g.start()
또는
spawn()
동일한 작업을 수행하는 바로 가기 인 classmethod 를 사용 하십시오.
>>> g = Greenlet.spawn(myfunction, 'arg1', 'arg2', kwarg1=1)
start
그린 렛이이 순간에 실행을 시작해야 함을 나타내는 데 사용 하는 것이 좋습니다. 따라서 두 개의 greenlet 개체를 만들고 그중 하나만 호출 start
하여 해당 개체 만 실행하도록합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다