Асинхронный вызов в синхронный вызов в Python - PullRequest
0 голосов
/ 25 февраля 2011

По сути, я собираюсь позвонить на удаленный сервер XMLRPC, и он будет обрабатывать запрос асинхронно.

import xmlrpclib

client = xmlrpclib.ServerProxy('http://localhost:8080')

client.add(3,5)


def add_result(result):
    print result

Я знаю, что когда-нибудь в будущем будет вызван add_result с результатом,Дело в том.Я хочу иметь возможность превратить вызов client.add в блокирующий вызов, который будет возвращать результат.Я делаю это для графического интерфейса, который будет вызывать меня.Вопрос в том, где мне искать информацию об этом решении?Я не совсем уверен, с чего начать.

Не думаю, что я вообще хорошо объяснил.Сервер, который я вызываю, выполняет асинхронную часть.Когда я позвоню добавить, он вернет истину.И я знаю, что сервер ожидает от меня реализации add_result, который он мне и вызовет.То, что я пытаюсь сделать, это очистить эту сумасшедшую схему, чтобы кто-то мог вызвать add на меня, и я буду блокировать, пока add_result не будет вызван для меня, и я вернусь к тому, кто мне звонил.Я надеюсь, что это проясняет ситуацию

Ответы [ 2 ]

0 голосов
/ 25 февраля 2011

Я согласен с Пинатором ...

Но в случае, если вам нужна помощь в блокировке ... конструкция для блокировки довольно проста:

class GUI():
    def __init__(self):
        self.blocking_thread = Thread(target=self.get_data)
        self.client = xmlrpclib.ServerProxy(...)

    def  query_for_data():
         self.blocking_thread.start()
         self.blocking_thread.join()

    def get_data(self):
        while(True):
            #this assumes this returns some how and doesn't block..
            result = self.client.add(...)
            if(result): break;

            time.sleep(1)
0 голосов
/ 25 февраля 2011

Ваша претензия ерунда. Операции xmlrpclib являются синхронными и блокирующими. Для выполнения асинхронных операций и т. Д. Вам нужно что-то реализовать с помощью потоков.

...