requestloop (loopCondition) не освобождается даже после того, как loopCondition имеет значение False - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть некоторые проблемы с методом requestLoop объекта Pyro4.Daemon.

Мне нужно удаленно вызвать метод "stop ()" для освобождения функции requestLoop и завершения работы моего демона.

Этот небольшой пример не работает

СЕРВЕР

#!/usr/bin/python
# -*- coding: utf-8 -*-
from daemon import Pyro4

class Audit(object):
    def start_audit(self):
        with Pyro4.Daemon() as daemon:
            self_uri = daemon.register(self)
            ns = Pyro4.locateNS()
            ns.register("Audit", self_uri)
            self.running = True
            print("starting")
            daemon.requestLoop(loopCondition=self.still_running)
            print("stopped")
            self.running = None

    def hi(self, string):
        print string

    def stop(self):
        self.running = False

    def still_running(self):
        return self.running

def main():

    # lancement de l'auditor
    auditor = Audit()
    auditor.start_audit()

if __name__ == "__main__" :
    main()

КЛИЕНТ

import Pyro4

def main():

    with  Pyro4.Proxy("PYRONAME:Audit") as au:
        au.hi("hello")
        au.hi("another hi")
        au.stop()

Я ожидаю увидеть на сервере печать "привет" и"еще один привет" и затем завершение работы.

Но завершение работы не происходит, сервер все еще заблокирован в методе requestloop.Я могу использовать свой прокси-сервер столько раз, сколько захочу.

НО, если я создам другого клиента, при первом удаленном вызове сервер отключится и клиент выдаст ошибку:

Pyro4.errors.ConnectionClosedError: receiving: not enough data

Все мои тесты говорят о том, что мне нужно создать 2-й прокси-сервер и выдать исключение для передачи requestloop на моем сервере.

Есть ли у кого-нибудь представление о том, как устранить эту проблему?

1 Ответ

2 голосов
/ 14 декабря 2011

Если вы посмотрите на examples/callback/client.py в источниках, вы увидите следующий комментарий:

# We need to set either a socket communication timeout,
# or use the select based server. Otherwise the daemon requestLoop
# will block indefinitely and is never able to evaluate the loopCondition.
Pyro4.config.COMMTIMEOUT=0.5

Следовательно, вам нужно установить COMMTIMEOUT в файле вашего сервера, и он будетработают нормально в соответствии с моими тестами.

Примечание: Вы также можете добавить оператор print в метод still_running, чтобы проверить, когда он вызывается.Без приведенной выше конфигурации вы увидите, что метод выполняется только при получении нового события, поэтому сервер не завершает работу после получения следующего события, которое установило running в False,Например, если вы выполните клиентскую программу дважды, сервер отключится.

...