สมมติว่าเรามีฟังก์ชันดัมมี่:
async def foo(arg):
result = await some_remote_call(arg)
return result.upper()
อะไรคือความแตกต่างระหว่าง:
import asyncio
coros = []
for i in range(5):
coros.append(foo(i))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(coros))
และ:
import asyncio
futures = []
for i in range(5):
futures.append(asyncio.ensure_future(foo(i)))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(futures))
บันทึก : ตัวอย่างส่งคืนผลลัพธ์ แต่นี่ไม่ใช่จุดสำคัญของคำถาม เมื่อค่าตอบแทนเรื่องการใช้งานแทนgather()
wait()
โดยไม่คำนึงถึงค่าตอบแทน, ensure_future()
ฉันกำลังมองหาเพื่อความชัดเจนในการwait(coros)
และwait(futures)
ทั้งสองเรียกใช้โครูทีนดังนั้นเมื่อใดและทำไมจึงควรพันโครูทีนensure_future
?
โดยพื้นฐานแล้ววิธีที่ถูกต้อง (tm) ในการเรียกใช้การดำเนินการที่ไม่บล็อกโดยใช้ Python 3.5 คือasync
อะไร?
หากต้องการรับเครดิตพิเศษจะต้องทำอย่างไรหากต้องการโทรเป็นกลุ่ม เช่นต้องโทรsome_remote_call(...)
1,000 ครั้ง แต่ฉันไม่ต้องการทำลายเว็บเซิร์ฟเวอร์ / ฐานข้อมูล / ฯลฯ ด้วยการเชื่อมต่อพร้อมกัน 1,000 ครั้ง สิ่งนี้ทำได้ด้วยเธรดหรือพูลกระบวนการ แต่มีวิธีดำเนินการด้วยasyncio
หรือไม่?
การอัปเดตปี 2020 (Python 3.7+) : อย่าใช้ข้อมูลโค้ดเหล่านี้ ใช้แทน:
import asyncio
async def do_something_async():
tasks = []
for i in range(5):
tasks.append(asyncio.create_task(foo(i)))
await asyncio.gather(*tasks)
def do_something():
asyncio.run(do_something_async)
ลองพิจารณาใช้Trioซึ่งเป็นทางเลือกของบุคคลที่สามที่มีประสิทธิภาพแทน asyncio
ensure_future()
หรือไม่? และถ้าฉันต้องการผลลัพธ์ฉันจะใช้run_until_complete(gather(coros))
ไม่ได้หรือ?