当我运行此代码时出现此错误:
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 许可协议
此问题与 ActiveMQ 无关。你在滥用信号。正如 Python 文档 所述:
我相信
on_message
方法是在它自己的线程中执行的,因为消息是异步接收的。简而言之, 不要 使用来自线程的信号。请改用 线程模块 中的同步原语。如果您无法避免使用信号,则在主线程上同步接收 STOMP 消息,而不是使用
ConnectionListener
。