เหตุใดคิวของฉันจึงค้างอยู่กับการวนซ้ำเหตุการณ์ asyncio

ฉันกำลังเปิดตัวกระบวนการใหม่ (แก้ไขสิ่งเดียวกันกับเธรดใหม่) สำหรับการคำนวณจากลูปเหตุการณ์ async กระบวนการใหม่นี้มีลูปเหตุการณ์ asyncio ของตัวเองที่ทำงานอยู่ และทำงานได้ดีโดยไม่มีพฤติกรรมการบล็อกใดๆ

ฉันสร้างสองคิว (multiprocessing.Queue หรือ multiprocessing.Manager.Queue) คิวหนึ่งสำหรับข้อความขาออก และอีกคิวสำหรับข้อความขาเข้า ฉันได้รับพฤติกรรมเดียวกันกับทั้งสองคิว คิวสำหรับข้อความขาออกทำงานได้ดี เนื่องจากฉันใส่/รับข้อความในคิวด้วย:

await asyncio.get_running_loop().run_in_executor(None, self.incoming_queue.put, msg)
msg = await asyncio.get_running_loop().run_in_executor(None, self.incoming_queue.get, True, 1)

อย่างไรก็ตาม เมื่อฉันพยายามเรียกใช้คำสั่ง get() เดียวกันในแอปพลิเคชัน asyncio ดั้งเดิมของฉันโดยใช้คำสั่ง asyncio run_in_executor มันก็ค้าง ลูปเหตุการณ์นั้นดูดีและตอบสนองได้ดี

การปิดใช้งานคิวการทำงานจะไม่เปลี่ยนแปลงสิ่งต่างๆ และผู้ดำเนินการก็ไม่เปลี่ยนแปลงเช่นกัน (ค่าเริ่มต้น เธรด หรือกระบวนการ)

ไอเดีย?


person Brian    schedule 17.10.2019    source แหล่งที่มา
comment
คุณสามารถสร้างตัวอย่างเล็กๆ น้อยๆ ที่เราสามารถเรียกใช้เพื่อสังเกตพฤติกรรมเดียวกันได้หรือไม่?   -  person user4815162342    schedule 18.10.2019
comment
ขณะที่ฉันแก้ไขจุดบกพร่องต่อไป ฉันได้เรียนรู้ว่าอาจเกี่ยวข้องกับการกำหนดค่าบางอย่างของลูปเหตุการณ์ใน Django Channels (แอปพลิเคชันที่ฉันพยายามรวมเข้าด้วยกัน) ฉันสร้าง asyncio loop ที่ง่ายกว่าเพื่อเรียกใช้โค้ด และแต่ละคิวดูเหมือนว่าจะทำงานได้ดี ฉันจะอัปเดตภายในไม่กี่ชั่วโมงหากมีการเปลี่ยนแปลงใดๆ และฉันอาจลบคำถามในเวลานั้นหากไม่มีข้อมูลที่เป็นประโยชน์อีกต่อไป   -  person Brian    schedule 18.10.2019


คำตอบ (1)


ฉันตัดสินใจที่จะให้คำตอบที่นี่ตามการสืบสวนของฉัน กล่าวโดยย่อ: สิ่งที่ทำงานในลูปเหตุการณ์ใหม่ในกระบวนการใหม่ ไม่ทำงานในลูปเหตุการณ์ Django Channels ด้วยเหตุผลใดก็ตาม

โซลูชันปัจจุบันของฉันคือการสร้างเธรดใหม่ด้วยตนเองเพื่อเรียกใช้ตัวฟังแบบซิงโครนัสของฉัน ฉันกำลังดูตัวเลือกว่าทำไมการวนซ้ำเหตุการณ์ Channels จึงไม่ทำงานในกรณีการใช้งานของฉัน

person Brian    schedule 18.10.2019