2

この問題は解決しました!

問題があります。私は Python を初めて使用し、複数のループを実行したいと考えています。WebSocket クライアント (Autobahn) を実行したいのですが、特定のフォルダー (pyinotify または Watchdog) で編集されたファイルを表示するループを実行したいと考えています。

両方とも永遠に実行されています。コールバック、マルチスレッド、マルチプロセッシング、または個別のファイルのように、FileSystemWatcher の実行中にそれらを一度に実行し、WebSocket 接続を介してメッセージを送信する方法はありますか?

    factory = WebSocketClientFactory("ws://localhost:8888/ws", debug=False)
    factory.protocol = self.webSocket
    connectWS(factory)
    reactor.run()

これを実行すると、成功します。しかし、これを実行すると:

    factory = WebSocketClientFactory("ws://localhost:8888/ws", debug=False)
    factory.protocol = self.webSocket
    connectWS(factory)
    reactor.run()

    # Websocket client running now,running the filewatcher     

    wm = pyinotify.WatchManager()

    mask = pyinotify.IN_DELETE | pyinotify.IN_CREATE  # watched events

    class EventHandler(pyinotify.ProcessEvent):
        def process_IN_CREATE(self, event):
            print "Creating:", event.pathname

        def process_IN_DELETE(self, event):
            print "Removing:", event.pathname
    handler = EventHandler()
    notifier = pyinotify.Notifier(wm, handler)
    wdd = wm.add_watch('/tmp', mask, rec=True)
    notifier.loop()

これにより2つのループが作成されますが、すでにループがあるため、「reactor.run()」の後のコードはまったく実行されません..

参考までに: このプロジェクトは同期クライアントになります。

どうもありがとう!

編集:エラーがあります。( http://pastebin.com/zHNG2c6U ) 私は今何をすべきかわからない..

webSocket クラス:

class webSocket(WebSocketClientProtocol):
    def sendHello(self):
        pass

    def onOpen(self):
        self.sendHello()

    def onMessage(self, msg, binary):
        print "Got echo: " + msg
        reactor.callLater(1, self.sendHello)

    def notify(ignore, filepath, mask):
        print "CALLBACK"
        #print "event %s on %s" % (', '.join(inotify.humanReadableMask(mask)), filepath)

edit2: ここで完全なコードを見ることができます: http://pastebin.com/iHKRcLVA

最終編集: 皆さん、返信ありがとうございます! コールバック 'def' をクラスの外に置くとうまくいきました!

4

2 に答える 2

1

Autobahn は、非同期アプリ フレームワークである Twisted 上に構築されています。これをすべて機能させるために、明示的なスレッド化は必要ありません。代わりに、 twisted.internet.inotifyを使用して FileSystemWatcher クラスを実装できます(ここに例があります)。

私は何年も Twisted を使っていないので、2 つのコンポーネントがどのように相互に通信するのかわかりません。しかし、ここにシリアルポートとの間でブリッジする例があります。

于 2013-11-02T09:35:02.380 に答える
1

Autobahn リポジトリの WebSocket を介した通知ベースのウォッチングとパブリッシュの完全なデモがここにあります。

これは Windows 用で、バックグラウンド スレッドで監視を実行します。Unix の場合は、Marcelo のアドバイスに従い、Twisted に付属する非同期のものを使用する必要があります。

于 2013-11-02T09:48:40.733 に答える