簡體   English   中英

多線程 python 時的運行時錯誤“運行時錯誤:線程 'Thread-1' 中沒有當前事件循環。”

[英]RuntimeError when multithreading python "RuntimeError: There is no current event loop in thread 'Thread-1'."

我正在嘗試使用相同的腳本一次運行多個不和諧機器人。 我這樣做的方法是下載一個 csv 文件,以獲取機器人令牌和機器人名稱。 然后我開始我的腳本:

import time, csv, re, random, string, sys, os, asyncio
from datetime import datetime
from threading import Thread
import discord
from dotenv import load_dotenv
from discord_webhook import DiscordWebhook, DiscordEmbed

def main(bottoken, botname):
    TOKEN = (bottoken)
    client = discord.Client()

    @client.event
    async def on_ready():
        print(f'{client.user.name} has connected to Discord!')

    @client.event
    async def on_message(message):
         #do stuff
         print('Do stuff')

    client.run(TOKEN)

def runtask():

    if __name__ == '__main__':
        with open('botinfo.csv', 'r') as f:
            reader = csv.reader(f, delimiter=',')
            for i, row in enumerate(reader):
                Thread(target = main, args=(row[0], row[1])).start()

if __name__ == '__main__':
    runtask()

但是后來我收到了這個錯誤:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/alexforman/Documents/GitHub/bot-price-monitor/frontend_multithread.py", line 14, in main
    client = discord.Client()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/discord/client.py", line 216, in __init__
    self.loop = asyncio.get_event_loop() if loop is None else loop
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/events.py", line 644, in get_event_loop
    % threading.current_thread().name)
RuntimeError: There is no current event loop in thread 'Thread-1'.

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/alexforman/Documents/GitHub/bot-price-monitor/frontend_multithread.py", line 14, in main
    client = discord.Client()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/discord/client.py", line 216, in __init__
    self.loop = asyncio.get_event_loop() if loop is None else loop
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/events.py", line 644, in get_event_loop
    % threading.current_thread().name)
RuntimeError: There is no current event loop in thread 'Thread-2'.

有沒有人對我如何解決它有任何想法?

您不需要為每個機器人啟動一個單獨的線程,asyncio 事件循環完全能夠同時為所有機器人提供服務。 (這就是事件循環的設計目的。)

您只需要將所有機器人作為同一個 asyncio 事件循環的協程啟動:

async def run_client(bottoken, botname):
    TOKEN = (bottoken)
    client = discord.Client()

    @client.event
    async def on_ready():
        print(f'{client.user.name} has connected to Discord!')

    @client.event
    async def on_message(message):
         #do stuff
         print('Do stuff')

    # can't use client.run() because it would block the event loop
    # but we can use client.start(), which is a coroutine that does
    # the same thing (and which is internally called by client.run)
    await client.start(TOKEN)

async def main():
    coros = []
    with open('botinfo.csv', 'r') as f:
        reader = csv.reader(f, delimiter=',')
        for i, row in enumerate(reader):
            coros.append(run_client(row[0], row[1]))
    await asyncio.gather(*coros)

if __name__ == '__main__':
    asyncio.run(main())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM