2013-11-02 3 views
2

Эта проблема решена!Python: две петли сразу

У меня проблема: я новичок в Python, и я хочу делать несколько циклов. Я хочу запустить клиент WebSocket (Autobahn), и я хочу запустить цикл, который показывает файл, который редактируется в определенной папке (pyinotify или Watchdog).

Оба работают вечно, отлично. Есть ли способ запустить их сразу и отправить сообщение через соединение WebSocket, когда я запускаю FileSystemWatcher, например, с обратными вызовами, многопоточными, многопроцессорными или просто отдельными файлами?

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

Эта ошибка: это, вероятно, проблема с вашим кодом, а не с Twisted. Загрузите свой полный код в GitHub или что-то в этом роде. Это не похоже на код, который вы разместили в своем Q выше. – oberstet

+0

Хорошо, я сделаю это через две минуты! Изменить: посмотрите описание, если хотите :) –

+0

попробуйте: 'def notify (self, ignore, filepath, mask):' .. отметить 'self' – oberstet

ответ

1

Autobahn построен на Twisted, который представляет собой асинхронную инфраструктуру приложения. Вам не нужна явная потоковая обработка, чтобы все это работало. Вместо этого вы можете реализовать класс FileSystemWatcher с помощью twisted.internet.inotify (есть пример here).

Я понятия не имею, как эти два компонента будут разговаривать друг с другом, поскольку я не использовал Twisted в течение многих лет. Но есть пример перехода на и из последовательного порта here.

+0

Было бы здорово, если я смогу его реализовать. Я посмотрю на это! Благодаря! Редактировать: Демонстрация на странице выглядит хорошо, я тестирую код сейчас :) –

+0

Это сработало, но разбилось! Вы можете проверить ошибку при расшифровке? –

1

Существует полная демо-версия для уведомлять на основе просмотра и публикации через WebSocket в реестре Autobahn here.

Это для Windows и запускает просмотр на фоне потока. Для Unix вы должны следовать советам Марсело и использовать что-то асинхронное, которое поставляется с Twisted.

+0

Ты помог мне решить проблемы! Благодаря Марсело за хорошее предложение, он работал, но разбился! Редактировать: Мне жаль, что нет поддержки Linux .. Edit2: О, вы уже это видели! В любом случае, спасибо! –

Смежные вопросы