Python:一次两个循环

时间:2013-11-02 09:16:03

标签: python multithreading loops websocket filesystemwatcher

此问题已解决!

我遇到了一个问题:我是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”排除在类之外效果很好!

2 个答案:

答案 0 :(得分:1)

Autobahn基于Twisted构建,这是一个异步应用程序框架。您不需要显式线程来使这一切正常工作。您可以使用twisted.internet.inotify实现FileSystemWatcher类(有一个示例here)。

我不知道这两个组件如何相互通信,因为我多年没有使用过Twisted。但是有一个与串行端口here进行桥接的示例。

答案 1 :(得分:1)

在Autobahn repo here中通过WebSocket观看和发布通知的完整演示。

这适用于Windows,并在后台线程上运行观看。对于Unix,你应该遵循Marcelo的建议并使用Twisted附带的asynch。