Mengapa antrian saya tergantung dengan event loop asyncio

Saya meluncurkan proses baru (edit hal yang sama berlaku untuk thread baru) untuk komputasi dari loop peristiwa asinkron. Proses baru ini menjalankan loop peristiwa asyncio-nya sendiri dan berjalan dengan baik tanpa perilaku pemblokiran apa pun.

Saya membuat dua antrian (multiprocessing.Queue atau multiprocessing.Manager.Queue), satu untuk pesan keluar, dan satu lagi untuk pesan masuk. Saya mendapatkan perilaku yang sama dengan kedua antrian. Antrian untuk pesan keluar berfungsi dengan baik, karena saya memasukkan/menerima pesan ke dalam antrian dengan:

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)

Namun, ketika saya mencoba menjalankan perintah get() yang sama di aplikasi asyncio asli saya menggunakan perintah asyncio run_in_executor, perintah itu hang. Perulangan acara itu sendiri tampak baik-baik saja dan responsif.

Menonaktifkan antrian kerja tidak mengubah banyak hal, begitu pula eksekutor (default, thread, atau proses).

Ide ide?


person Brian    schedule 17.10.2019    source sumber
comment
Bisakah Anda membuat contoh minimal yang bisa kita jalankan untuk mengamati perilaku yang sama?   -  person user4815162342    schedule 18.10.2019
comment
Saat saya melanjutkan debugging, saya telah belajar bahwa itu mungkin ada hubungannya dengan beberapa konfigurasi loop acara di Django Channels (aplikasi yang saya coba integrasikan). Saya membuat loop asyncio yang lebih sederhana untuk menjalankan kode, dan setiap antrian tampaknya berjalan dengan baik. Saya akan memperbaruinya dalam beberapa jam jika ada perubahan, dan saya dapat menghapus pertanyaan tersebut saat itu juga jika saya tidak memiliki informasi bermanfaat lainnya.   -  person Brian    schedule 18.10.2019


Jawaban (1)


Saya telah memutuskan untuk membuat jawaban di sini berdasarkan penyelidikan saya. Singkatnya: apa yang berfungsi di perulangan kejadian baru dalam proses baru TIDAK berfungsi di perulangan peristiwa Saluran Django karena satu dan lain alasan.

Solusi saya saat ini adalah membuat thread baru secara manual untuk menjalankan pendengar sinkron saya. Saya sedang mencari opsi mengapa loop acara Channels tidak berfungsi dalam kasus penggunaan saya.

person Brian    schedule 18.10.2019