φυβλαςのβλογ
phyblas的博客



แก้ปัญหา asyncio ใน spyder ด้วย nest_asyncio
เขียนเมื่อ 2020/03/11 14:23
แก้ไขล่าสุด 2024/02/22 09:42
ใครที่พยายามจะใช้มอดูล asyncio ในไพธอนอาจเจอปัญหาตอนพยายามสั่งรันลูปโดยมีข้อผิดพลาดขึ้นมาในลักษณะว่า
RuntimeError: This event loop is already running

หรืออะไรทำนองนี้ ขึ้นอยู่กับคำสั่งที่ลองใช้ดู แต่ปัญหาโดยรวมก็เกิดจากการที่มีลูปถูกรันอยู่แล้ว จึงทำให้ไม่สามารถสั่งรันลูปเพิ่มได้

ปัญหานี้อาจเกิดเมื่อรันใน spyder (เช่นที่ใช้ใน anaconda) เพราะใน spyder จะมีการรันลูปอยู่ในตัวแล้ว เมื่อพยายามจะรันลูปขึ้นมาอีกก็เลยเจอข้อผิดพลาดซึ่งเตือนว่ารันลูปอยู่แล้ว

เมื่อค้นเกี่ยวกับปัญหานี้ดูก็ได้ไปเจอวิธีที่จะแก้ไขได้ นั่นคือใช้มอดูล nest_asyncio
>> https://www.cnpython.com/pypi/nest-asyncio

มอดูลนี้จะทำให้สามารถรันลูปของ asyncio ได้ แม้ว่าจะใช้ spyder อยู่

สามารถติดตั้งได้ด้วย pip
pip install nest-asyncio

วิธีใช้ก็ง่าย แค่ใส่โค้ดนี้ลงไป หลังจากนั้นก็จะสามารถใช้งานได้
import nest_asyncio
nest_asyncio.apply()

ตัวอย่างการใช้
import asyncio,nest_asyncio,time
nest_asyncio.apply()

async def sawatdilok(s):
    print('สวัสดีโลก%s ~ %.6f'%(s,time.time()-t0))
    await asyncio.sleep(1)
    print('ลาก่อนโลก%s ~ %.6f'%(s,time.time()-t0))

t0 = time.time()
sawa = [sawatdilok('นี้'),sawatdilok('หน้า'),sawatdilok('โน้น')]
asyncio.run(asyncio.gather(*sawa))

ได้
สวัสดีโลกนี้ ~ 0.000146
สวัสดีโลกหน้า ~ 0.000279
สวัสดีโลกโน้น ~ 0.000327
ลาก่อนโลกนี้ ~ 1.002465
ลาก่อนโลกหน้า ~ 1.002754
ลาก่อนโลกโน้น ~ 1.002794

ถ้าหากไม่ได้ใช้ nest_asyncio.apply() ก่อน การรันนี้ก็คงจะเกิดข้อผิดพลาดขึ้นมาเมื่อรันใน spyder ว่า
RuntimeError: asyncio.run() cannot be called from a running event loop

แต่เมื่อใช้แล้วน่าจะสามารถรันออกมาได้ตามปกติ ไม่ติดปัญหาตรงนี้

หรือต่อให้ไม่ได้รันผ่าน spyder ก็ไม่ได้ทำให้เกิดผลอะไรเปลี่ยนแปลง ไปรันจากที่อื่นตามปกติก็ใช้ได้เหมือนกัน

อย่างไรก็ตาม พวกคำสั่งที่ใช้ asyncio แบบนี้รันผ่านคอมมานด์ไลน์โดยตรง แทนที่จะรันผ่าน spyder น่าจะดีกว่า


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  查看日志

  推荐日志

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ