คำถามติดแท็ก python-asyncio

3
Asyncio.gather vs asyncio.wait
asyncio.gatherและasyncio.waitดูเหมือนว่าจะมีการใช้งานที่คล้ายกัน: ฉันมีหลายสิ่ง async ที่ฉันต้องการที่จะดำเนินการ / รอ (ไม่จำเป็นต้องรอให้เสร็จก่อนที่จะเริ่มต้นต่อไป) พวกเขาใช้ไวยากรณ์ที่แตกต่างกันและแตกต่างกันในรายละเอียดบางอย่าง แต่ดูเหมือนว่าฉันจะไม่รู้สึกไพเราะมากนักที่มี 2 ฟังก์ชั่นที่มีการทับซ้อนกันอย่างมากในการทำงาน ฉันพลาดอะไรไป

4
asyncio ทำงานอย่างไร?
คำถามนี้ได้รับแรงบันดาลใจจากคำถามอื่นของฉัน: จะรอใน cdef ได้อย่างไร? มีบทความและบล็อกโพสต์มากมายบนเว็บเกี่ยวกับasyncioแต่ทั้งหมดเป็นเพียงผิวเผิน ฉันไม่พบข้อมูลใด ๆ เกี่ยวกับวิธีasyncioการนำไปใช้จริงและสิ่งใดที่ทำให้ I / O ไม่ตรงกัน ฉันพยายามอ่านซอร์สโค้ด แต่เป็นรหัส C ระดับสูงสุดหลายพันบรรทัดซึ่งส่วนใหญ่เกี่ยวข้องกับอ็อบเจ็กต์เสริม แต่ที่สำคัญที่สุดคือยากที่จะเชื่อมต่อระหว่างไวยากรณ์ Python กับโค้ด C ที่จะแปล เป็น. เอกสารของ Asycnio เองก็มีประโยชน์ไม่น้อย ไม่มีข้อมูลเกี่ยวกับวิธีการทำงานมีเพียงหลักเกณฑ์บางประการเกี่ยวกับวิธีใช้งานซึ่งบางครั้งอาจทำให้เข้าใจผิด / เขียนได้ไม่ดี ฉันคุ้นเคยกับการใช้โครูทีนของ Go และหวังว่า Python จะทำแบบเดียวกัน หากเป็นเช่นนั้นรหัสที่ฉันสร้างขึ้นในโพสต์ที่ลิงก์ด้านบนจะใช้งานได้ เนื่องจากไม่เป็นเช่นนั้นตอนนี้ฉันกำลังพยายามหาสาเหตุ การคาดเดาที่ดีที่สุดของฉันมีดังนี้โปรดแก้ไขฉันที่ฉันผิด: ข้อกำหนดขั้นตอนของแบบฟอร์ม async def foo(): ...ถูกตีความว่าเป็นวิธีการของคลาสที่สืบทอดcoroutineมา บางที async defถูกแบ่งออกเป็นหลายวิธีโดยawaitคำสั่งโดยที่วัตถุซึ่งเรียกวิธีการเหล่านี้สามารถติดตามความคืบหน้าของการดำเนินการได้จนถึงตอนนี้ หากข้างต้นเป็นจริงโดยพื้นฐานแล้วการเรียกใช้โครูทีนจะทำให้เมธอดเรียกใช้วัตถุโครูทีนโดยผู้จัดการระดับโลกบางคน (ลูป?) ผู้จัดการระดับโลกทราบว่าเมื่อใดที่การดำเนินการ I / O …

4
การประมวลผลหลายขั้นตอนเทียบกับมัลติเธรดเทียบกับ asyncio ใน Python 3
ฉันพบว่าในหลาม 3.4 มีห้องสมุดที่แตกต่างกันไม่กี่ multiprocessing / เกลียว: multiprocessing VS เกลียว VS asyncio แต่ไม่รู้จะใช้อันไหนดีหรือ "แนะนำ" พวกเขาทำสิ่งเดียวกันหรือแตกต่างกัน? ถ้าเป็นเช่นนั้นใช้สำหรับอะไร? ฉันต้องการเขียนโปรแกรมที่ใช้มัลติคอร์ในคอมพิวเตอร์ของฉัน แต่ฉันไม่รู้ว่าควรเรียนห้องสมุดไหนดี

4
"ไฟแล้วลืม" python async / รอ
บางครั้งมีการดำเนินการแบบอะซิงโครนัสที่ไม่สำคัญบางอย่างที่จำเป็นต้องเกิดขึ้น แต่ฉันไม่ต้องการรอให้เสร็จสิ้น ในการใช้งานโครูทีนของ Tornado คุณสามารถ "ยิงและลืม" ฟังก์ชันอะซิงโครนัสได้โดยเพียงแค่จำyieldคำสำคัญ ฉันพยายามหาวิธี "ยิงและลืม" ด้วยไวยากรณ์async/ awaitไวยากรณ์ใหม่ที่เผยแพร่ใน Python 3.5 เช่นข้อมูลโค้ดแบบง่าย: async def async_foo(): print("Do some stuff asynchronously here...") def bar(): async_foo() # fire and forget "async_foo()" bar() สิ่งที่เกิดขึ้นแม้ว่าจะbar()ไม่ดำเนินการและเราได้รับคำเตือนรันไทม์แทน: RuntimeWarning: coroutine 'async_foo' was never awaited async_foo() # fire and forget "async_foo()"

4
ความแตกต่างระหว่าง Coroutine และ Future / Task ใน Python 3.5
สมมติว่าเรามีฟังก์ชันดัมมี่: 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) ในการเรียกใช้การดำเนินการที่ไม่บล็อกโดยใช้ …

4
asyncio.ensure_future กับ BaseEventLoop.create_task เทียบกับโครูทีนแบบธรรมดา?
ฉันเคยเห็นบทแนะนำ Python 3.5 พื้นฐานหลายตัวเกี่ยวกับ asyncio ที่ดำเนินการแบบเดียวกันในรสชาติต่างๆ ในรหัสนี้: import asyncio async def doit(i): print("Start %d" % i) await asyncio.sleep(3) print("End %d" % i) return i if __name__ == '__main__': loop = asyncio.get_event_loop() #futures = [asyncio.ensure_future(doit(i), loop=loop) for i in range(10)] #futures = [loop.create_task(doit(i)) for i in range(10)] futures = [doit(i) for …

5
วิธีตั้งค่าแอตทริบิวต์คลาสด้วยการรอใน __init__
ฉันจะกำหนดคลาสด้วยawaitตัวสร้างหรือตัวคลาสได้อย่างไร ตัวอย่างสิ่งที่ฉันต้องการ: import asyncio # some code class Foo(object): async def __init__(self, settings): self.settings = settings self.pool = await create_pool(dsn) foo = Foo(settings) # it raises: # TypeError: __init__() should return None, not 'coroutine' หรือตัวอย่างที่มีคลาส body แอตทริบิวต์: class Foo(object): self.pool = await create_pool(dsn) # Sure it raises syntax Error def …

2
วิธีการใช้ django 3.0 ORM ใน Jupyter Notebook โดยไม่ทริกเกอร์การตรวจสอบบริบทของ async?
Django 3.0 คือการเพิ่มasgi สนับสนุน / async และด้วยยามรอบทำให้การร้องขอการซิงโครในบริบท ขณะเดียวกันIPython เพิ่งเพิ่มระดับบนสุด async สนับสนุน / รอคอยซึ่งดูเหมือนว่าจะทำงานภายในเซสชั่นล่ามทั้งห่วงเหตุการณ์เริ่มต้น น่าเสียดายที่การรวมกันของการเพิ่มที่ยอดเยี่ยมทั้งสองนี้หมายความว่าการดำเนินการ django ORM ในสมุดบันทึก jupyter ทำให้เกิดSynchronousOnlyOperationข้อยกเว้น: SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async. ดังที่ข้อความแสดงข้อยกเว้นบอกว่าเป็นไปได้ที่จะรวมการเรียก ORM แต่ละครั้งในลักษณะที่sync_to_async()คล้ายกัน: images = await sync_to_async(Image.objects.all)() แต่ไม่สะดวกโดยเฉพาะอย่างยิ่งสำหรับฟิลด์ที่เกี่ยวข้องซึ่งโดยปกติจะได้รับการแก้ไขโดยปริยายในการค้นหาแอตทริบิวต์ (ฉันลอง%autoawait offใช้เวทย์มนตร์ แต่มันใช้งานไม่ได้จากการมองอย่างรวดเร็วที่เอกสารฉันคิดว่าเป็นเพราะ ipykernels มักจะทำงานในลูป asyncio) ดังนั้นมีวิธีการอย่างใดอย่างหนึ่งปิดการซิงค์ในบริบทการตรวจสอบ async …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.