运行此代码时,出现此错误:
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")
答案 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"