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

时间:2019-02-18 14:22:55

标签: python web-scraping

运行此代码时,出现此错误:

  

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

3 个答案:

答案 0 :(得分:0)

此问题与ActiveMQ没有任何关系。您正在滥用信号。正如Python documentation所述:

  

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

     

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

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

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

答案 1 :(得分:0)

通过在/usr/lib/pithon3.7/pdb.py中手动应用此补丁,我在python3.7.3中修复了该问题

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

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

如果将此补丁回移植到流行版本中,那将是非常好的。

答案 2 :(得分:0)

安装后问题解决:

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