【问题标题】:ValueError: signal only works in main threadValueError:信号仅在主线程中有效
【发布时间】:2019-02-18 14:22:54
【问题描述】:

当我运行这段代码时,我得到了这个错误:

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")

【问题讨论】:

    标签: python web-scraping


    【解决方案1】:

    我在 python3.7.3 中通过手动将此补丁应用到/usr/lib/python3.7/pdb.py 来修复它

    https://github.com/python/cpython/commit/8d64bfafdffd9f866bb6ac2e5b4c4bdfcb16aea0
    

    我想有更好的方法可以在不修补 python 库的情况下实现相同的效果(例如,传递一个修补过的文件作为参数),但这似乎已经足够了。

    如果这个补丁能被移植到流行版本,那就太好了。

    【讨论】:

      【解决方案2】:

      此问题与 ActiveMQ 无关。你在滥用信号。正如Python documentation 所说:

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

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

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

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

      【讨论】:

      • 任何代码帮助,因为我找不到解决方案
      • 你试过什么?为什么您尝试的方法不起作用?请澄清。
      【解决方案3】:

      我安装后解决的问题:

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

      【讨论】:

        猜你喜欢
        • 2014-11-06
        • 2019-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多