首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用线程引发的不协调操作"RuntimeError: set_wakeup_fd只在主线程中工作“仅在linux上使用

使用线程引发的不协调操作"RuntimeError: set_wakeup_fd只在主线程中工作“仅在linux上使用
EN

Stack Overflow用户
提问于 2020-07-01 07:38:02
回答 2查看 3.3K关注 0票数 6

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

代码语言:javascript
运行
复制
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

我已经从python3.7升级到python3.8,但是我仍然有相同的错误。

下面是我的代码: main.py (webserver已工作)

代码语言:javascript
运行
复制
dcbot = m_threadingmaker.myThread("Bot", client, secrets.token)
webserver = m_threadingmaker.myThread("Flask", app, 'localhost', '7010')

#webserver.start()
dcbot.start()

M_threadingmaker.py

代码语言:javascript
运行
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-01 11:15:10

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

更详细的示例here

票数 1
EN

Stack Overflow用户

发布于 2020-07-02 15:18:35

代码语言:javascript
运行
复制
webserver.start()
dcbot.run()

好的,现在启动webserver和bot。但是当我试图在机器人启动后做些什么的时候,什么都不会发生。然而,我感兴趣的是为什么会这样。如果有人知道一个好的和广泛的贡献,如书籍的线程,请发送它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62671883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档