Python中异步调用转为同步调用

0 投票
2 回答
1332 浏览
提问于 2025-04-16 12:33

简单来说,我要去调用一个远程的XMLRPC服务器,它会异步处理我的请求。

import xmlrpclib

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

client.add(3,5)


def add_result(result):
    print result

我知道在未来的某个时刻,add_result这个函数会被调用,并且会带上结果。问题是,我想把client.add这个调用变成一个阻塞调用,也就是说它会等到结果出来再返回给我。我这样做是为了配合一个图形用户界面(GUI),这个界面会调用我。我想知道应该去哪里找相关的资料来解决这个问题?我其实不太确定从哪里开始。

我觉得我没有把自己想说的表达清楚。我要调用的服务器已经实现了异步处理。当我调用add时,它会返回true。而且我知道服务器希望我实现add_result这个函数,服务器会在适当的时候调用我。我的目标是把这个复杂的流程理顺,让别人调用add时,我会一直等到add_result被调用,然后再把结果返回给调用我的人。希望这样能让事情更清楚。

2 个回答

0

我同意pynator的看法...

不过如果你需要关于阻塞部分的帮助...设计阻塞其实很简单:

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

你说的完全不对。xmlrpclib 的操作是同步的,也就是说它会一个接一个地执行,直到完成才会继续进行。如果你想要实现异步操作,也就是同时做几件事情,你就需要用到线程来实现。

撰写回答