Was sind die Implementierungsmethoden von Python-Coroutinen?

WBOY
Freigeben: 2023-04-23 10:22:06
nach vorne
1725 Leute haben es durchsucht

1. Coroutinen

Computer stellen nicht nur Prozesse und Threads bereit. Coroutine ist ein künstlich erstellter Mikroprozess zum Wechseln des Benutzermodus, bei dem ein Thread verwendet wird, um zwischen mehreren Prozessen hin und her zu wechseln.

Mehrere Methoden zur Implementierung von Coroutine. Status speichern

  • asyncio decorator (3.4)

  • async, waiting keyword (3.5) [Empfohlen]

  • 1.1greenlet implementiert Coroutine

    pip install greenlet
    
    from greenlet import greenlet
    def fun1():
      gre2.switch()#切换到fun2
      pass
    def fun2():
      gre1.switch()#切换到fun1
      pass
    gre1 = greenlet(func1)
    gre2 = greenlet(func2)
    gre1.switch()#先去执行fun1
    Nach dem Login kopieren
  • 1.2yield keyword implementiert Coroutine
  • 1.3 Verwenden Sie das Asyncio-Modul, um Coroutinen implementieren

  • Es kann erst nach der Python3.4-Version verwendet werden (keine Installation erforderlich, es befindet sich in der Standardbibliothek)
def func1():
    yield 1
    yield from func2()
    yield 2
    
def func2():
    yield 3
    yield 4
f1 = func1()
for item in f1:
    print(item,end=" ")
    
#打印结果
1 3 4 2
Nach dem Login kopieren

1.4Async & Wait-Schlüsselwörter zum Implementieren von Coroutinen

import asyncio
#使用该装饰器装饰后,该函数就是一个协程函数
@asyncio.coroutine
def func1():
    print(1)
    #遇到IO操作时,会自动切换到taks中的其他任务函数
    yield from asyncio.sleep(2)
    print(2)

@asyncio.coroutine
def func2():
    print(3)
    yield from asyncio.sleep(2)
    print(4)
    
#将两个协程函数封装成一个tasks列表
tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]
#
loop = asyncio.get_event_loop()
loop.run_until_complete(func1())
Nach dem Login kopieren

2. Die Bedeutung von Coroutinen

If Der Thread stößt auf eine E/A-Wartezeit. Der Thread wartet nicht dumm, sondern nutzt die Leerlaufzeit, um andere Dinge zu tun, dh der Prozess wird asynchron ausgeführt.

import asyncio
#使用该装饰器装饰后,该函数就是一个协程函数

async def func1():
    print(1)
    #遇到IO操作时,会自动切换到tasks中的其他任务函数
    await asyncio.sleep(2)
    print(2)


async def func2():
    print(3)
    await asyncio.sleep(2)
    print(4)
    
#将两个协程函数封装成一个tasks列表
tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]

loop = asyncio.get_event_loop()
loop.run_until_complete(tasks)
Nach dem Login kopieren
3. Asynchrone Programmierung

Coroutine-Objekt: Beim Ausführen einer Coroutine-Funktion wird ein Coroutine-Objekt erhalten.

#协程请求资源使用第三方库aiohttp
import aiohttp
Nach dem Login kopieren

Hinweis: Für das Coroutine-Objekt, das beim Ausführen einer Coroutine-Funktion erhalten wird, wird der Code in der Funktion nicht ausgeführt Erwartbares Objekt {Coroutine-Objekt, zukünftiges Objekt, Aufgabenobjekt} (ähnlich wie I O Wait)

#伪代码
任务列表 = [task1,task2...]
while True:
  for 就绪任务 in 可执行任务列表:
    执行
  for 已完成任务 in 已完成任务列表:
    从任务列表中删除

import asyncio 

#生成一个书简循环
loop = asyncio.get_event_loop()
#将任务放到任务列表中
loop.run_until_complete(任务)
Nach dem Login kopieren

await besteht darin, auf den Wert des Objekts zu warten, um das Ergebnis zu erhalten, bevor mit der Ausführung des Ausführungsergebnisses fortgefahren wird

Ausführungs-Coroutine Der interne Code der Prozessfunktion

start

end

Die E/A-Anfrage endet und das Ergebnis ist: 1

Das obige ist der detaillierte Inhalt vonWas sind die Implementierungsmethoden von Python-Coroutinen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage