Discordbot 使用线程引发“RuntimeError:set_wakeup_fd 仅适用于主线程”仅在 linux 上

Posted

技术标签:

【中文标题】Discordbot 使用线程引发“RuntimeError:set_wakeup_fd 仅适用于主线程”仅在 linux 上【英文标题】:Discordbot using threading raise "RuntimeError: set_wakeup_fd only works in main thread" only on linux 【发布时间】:2020-10-21 14:36:51 【问题描述】:

我正在使用线程模块同时托管 Web 服务器和 Discord 机器人。一切在 Windows 上运行良好,但一旦我将它加载到我的 Linux 服务器上,我就会收到以下错误:

Starting Bot
Exception in thread Bot:
Traceback (most recent call last):
  File "/usr/lib/python3.8/asyncio/unix_events.py", line 95, in add_signal_handler
    signal.set_wakeup_fd(self._csock.fileno())
ValueError: set_wakeup_fd only works in main thread

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
  File "/home/webadmin/discordbot/bot/moduls/m_threadingmaker.py", line 15, in run
    self.client.run(self.args[0])
  File "/home/webadmin/discordbot/bot/venv/lib/python3.8/site-packages/discord/client.py", line 614, in run
    loop.add_signal_handler(signal.SIGINT, lambda: loop.stop())
  File "/usr/lib/python3.8/asyncio/unix_events.py", line 97, in add_signal_handler
    raise RuntimeError(str(exc))
RuntimeError: set_wakeup_fd only works in main thread

我已经从 python 3.7 升级到 python 3.8,但我仍然有同样的错误。

这是我的代码: main.py(网络服务器工作)

dcbot = m_threadingmaker.myThread("Bot", client, secrets.token)
webserver = m_threadingmaker.myThread("Flask", app, 'localhost', '7010')

#webserver.start()
dcbot.start()

M_threadingmaker.py

from threading import Thread

class myThread (Thread):
   def __init__(self, name, client, *args):
      Thread.__init__(self)
      self.name = name
      self.client = client
      self.args = args

   def run(self):
      print("Starting " + self.name)
      if self.name == "Flask":
          self.client.run(host=self.args[0], port=self.args[1])
      else:
          self.client.run(self.args[0])
      print("Exiting " + self.name)

【问题讨论】:

有它的示例脚本吗?我尝试在 gunicorn 中分离线程但总是失败,机器人离线 【参考方案1】:

我建议你在异步协程中使用client.start(),而不是在单独的线程中使用client.run()

更详细的例子here

【讨论】:

如何实现,如果我分离线程,烧瓶中的运行时是这样的错误 RuntimeError: set_wakeup_fd only works in main thread【参考方案2】:
webserver.start()
dcbot.run()

好的,现在它启动网络服务器和机器人。但是当我在机器人启动后尝试做某事时,什么也没有发生。但是,我对为什么会这样感兴趣。如果有人知道关于线程的书籍等优秀而广泛的贡献,请发送它

【讨论】:

以上是关于Discordbot 使用线程引发“RuntimeError:set_wakeup_fd 仅适用于主线程”仅在 linux 上的主要内容,如果未能解决你的问题,请参考以下文章

chrome.runtime.sendMessage 引发“未捕获的类型错误:无法调用未定义的方法‘sendMessage’”

'Android.Runtime.UncaughtExceptionHandler'的类型初始值设定项引发了异常

Discord bot 无法使用线程,卡住错误:必需的位置参数:'ctx'

使用 Discord.py 在有权限的情况下发送嵌入频道会引发异常

使用RunTime.getRunTime().addShutdownHook优雅关闭线程池

使用RunTime.getRunTime().addShutdownHook优雅关闭线程池