1. ホーム
  2. python

[解決済み] ValueError: シグナルはメインスレッドでのみ動作します。

2022-02-02 05:11:37

質問

このコードを実行すると、次のようなエラーが発生します。

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

解決方法は?

この問題は、ActiveMQとは関係ありません。シグナルの使い方を間違えているのです。シグナルは Pythonのドキュメント と記載されています。

Pythonのシグナルハンドラは、シグナルが他のスレッドで受信されたとしても、常にPythonのメインスレッドで実行されます。これは、シグナルがスレッド間通信の手段として使えないことを意味します。代わりにthreadingモジュールからの同期プリミティブを使用することができます。

また、新しいシグナルハンドラを設定できるのはメインスレッドのみです。

を使うのがいいと思います。 on_message メソッドは、メッセージの受信が非同期であるため、独自のスレッドで実行されます。

要するに ドンマイ スレッドからのシグナルを使用します。の同期プリミティブを使用します。 スレッディングモジュール 代わりに もしシグナルの使用を避けられないのであれば、STOMPメッセージをメインスレッドで同期的に受信するために ConnectionListener .