ValueError:信号仅在主线程中有效

新手上路,请多包涵

当我运行此代码时出现此错误:

ValueError:信号仅在主线程中有效

我正在使用 ActiveMQ。

RealTor 是我的 Spider(selogerSpider) 的名字,这个帮助我进行抓取。

  import stomp
 from RealTor import selogerSpider
 from scrapy.crawler import CrawlerProcess
 from scrapy.settings import Settings

class MyListener(stomp.ConnectionListener):
def on_error(self, headers, message):
    print('received an error "%s"' % message)
def on_message(self, headers, message):
    print('received a message "%s"' % message)

    settings = Settings()
    settings.set("USER_AGENT",
                 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4)
    AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36")
    settings.set("LOG_ENABLED", False)
    crawler = CrawlerProcess(settings)
    crawler.crawl(selogerSpider)
    selogerSpider.signals.engine_started()
    print("STARTING scraping")
    crawler.start()
    print("Scraping STOPPED")
try:
conn = stomp.Connection()
conn.set_listener('', MyListener())
conn.start()
""" conn = stomp.Connection([('0.0.0.0', 61613)])"""
conn.connect('admin', 'password', wait=True)
conn.subscribe(destination='/queue/test', id=1, ack='auto')
print('subscripe')
"""conn.send(body=' '.join(sys.argv[1:]), destination='/queue/test')"""
input("coucou")
"""conn.disconnect()"""
print('end')

except IOError as e:
  print("error message")

原文由 joes 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 527
2 个回答

此问题与 ActiveMQ 无关。你在滥用信号。正如 Python 文档 所述:

Python 信号处理程序始终在主 Python 线程中执行,即使信号是在另一个线程中接收到的。这意味着信号不能用作线程间通信的手段。您可以改用线程模块中的同步原语。

此外,只允许主线程设置新的信号处理程序。

我相信 on_message 方法是在它自己的线程中执行的,因为消息是异步接收的。

简而言之, 不要 使用来自线程的信号。请改用 线程模块 中的同步原语。如果您无法避免使用信号,则在主线程上同步接收 STOMP 消息,而不是使用 ConnectionListener

原文由 Justin Bertram 发布,翻译遵循 CC BY-SA 4.0 许可协议

我安装后解决的问题:

 pip3 install "pyzmq==17.0.0" "ipykernel==4.8.2"

原文由 ah bon 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题