이 글은 Python의 코루틴에 대한 자세한 설명을 제공합니다(예제 포함). 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
마이크로 스레드 및 파이버라고도 알려진 코루틴. 영어 이름 Coroutine
코루틴은 서브루틴처럼 보이지만 실행 중에 서브루틴 내부에서 중단되었다가 다른 서브루틴 실행으로 전환되었다가 적절한 시점에 다시 실행을 계속할 수 있습니다.
yield는 코루틴을 구현합니다
Python의 코루틴 지원은 여전히 매우 제한적입니다. 생성기에 사용되는 Yield는 어느 정도 코루틴을 구현할 수 있습니다. 비록 지원이 완전하지는 않지만 이미 상당한 위력을 발휘할 수 있습니다.
import threading import time def producer(c): c.__next__() n=0 while n c.send(n) --> n更新 n = yield r if not n: break print('[消费者]正在调用第%s条数据' %(n)) time.sleep(1) r = 'This is ok!' if __name__=='__main__': print(threading.current_thread()) print(threading.active_count()) #查看当前进行的线程 c = consumer() producer(c) #函数中有yield, 返回值为生成器; print(threading.active_count()) #1
gevent 라이브러리는 코루틴을 구현합니다
Python은 Yield를 통해 코루틴에 대한 기본 지원을 제공하지만 완전하지는 않습니다. 타사 gevent는 Python에 대해 비교적 완전한 코루틴 지원을 제공합니다.
gevent는 greenlet을 통해 코루틴을 구현하는 타사 라이브러리입니다. 기본 아이디어는 다음과 같습니다.전환은 IO 작업 중에 자동으로 완료되므로 gevent는 시작 시 Python과 함께 제공되는 일부 표준 라이브러리를 수정해야 합니다.
여러 코루틴에 의해 실행되는 작업에 IO 작업이나 대기가 없다고 가정하면 코루틴은 교대로 실행되는 대신 순차적으로 실행됩니다.
여러 코루틴에 의해 실행되는 작업에 IO 작업이나 대기가 있다고 가정하면 코루틴이 교대로 실행됩니다.
#没有等待 import gevent from gevent import monkey monkey.patch_all() def job(n): for i in range(n): print(gevent.getcurrent(),i) def mian(): g1 = gevent.spawn(job,1) g2 = gevent.spawn(job,2) g3 = gevent.spawn(job,3) gevent.joinall([g1,g2,g3]) print('协程执行任务结束...') if __name__=="__main__": mian()
코루틴과 스레드
코루틴과 스레드에 소요된 시간을 비교 실험해 보세요. 이는 유익하지 않습니다.""" #有等待 import time from gevent import monkey monkey.patch_all() import gevent def job(n): for i in range(n): print(gevent.getcurrent(), i) time.sleep(1) def main1(): # 创建三个协程, 并让该协程执行job任务 g1 = gevent.spawn(job, 2) g2 = gevent.spawn(job, 3) g3 = gevent.spawn(job, 2) # 等待所有的协程执行结束, 再执行主程序; gevent.joinall([g1, g2, g3]) print("任务执行结束.....") main1()
위 내용은 Python의 코루틴에 대한 자세한 설명(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!