此问题已解决!
我遇到了一个问题:我是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”排除在类之外效果很好!
答案 0 :(得分:1)
Autobahn基于Twisted构建,这是一个异步应用程序框架。您不需要显式线程来使这一切正常工作。您可以使用twisted.internet.inotify实现FileSystemWatcher类(有一个示例here)。
我不知道这两个组件如何相互通信,因为我多年没有使用过Twisted。但是有一个与串行端口here进行桥接的示例。
答案 1 :(得分:1)
在Autobahn repo here中通过WebSocket观看和发布通知的完整演示。
这适用于Windows,并在后台线程上运行观看。对于Unix,你应该遵循Marcelo的建议并使用Twisted附带的asynch。