2014-01-21 69 views
0

我有一个关于异步调用正在运行的进程的问题。例如,我有一个用python编写的程序。 (称之为test.py)使用python进程的异步请求

import time 

def run(): 
    while True: 
     print "This is run function print" 
     time.spleep(2) 

def get_dict() 
    return {'a': 1} 

if __name__ == "__main__": 
    run() 

现在,我运行test.py,在那之后我想通过异步网络请求,这个过程并获得get_dict函数的值。 这可能吗?

我AVE试图用龙卷风IOLoop,使Web请求test.py

我在异步编程绝对零度,真的没有一个明确的想法,它应该怎么做。因此,我的问题可能会很混乱。

+2

该问题似乎并不是异步*发出请求,而是异步*响应*。但是您需要发布更多关于服务器和客户端实际上都在做什么的细节。 –

+0

对不起,我没有添加一个wile循环 –

回答

1

龙卷风安装和运行这个:

from datetime import timedelta 
from tornado import gen, ioloop, web 

i = 0 

@gen.coroutine 
def run(): 
    global i 
    loop = ioloop.IOLoop.current() 
    while True: 
     print "This is run function print" 
     yield gen.Task(loop.add_timeout, timedelta(seconds=1)) 
     i += 1 


def get_dict(): 
    return {'a': i} 


class DictHandler(web.RequestHandler): 
    def get(self): 
     # Tornado converts dicts to JSON. 
     self.finish(get_dict()) 

if __name__ == "__main__": 
    application = web.Application([ 
     ('/dict', DictHandler), 
    ]) 
    application.listen(8888) 
    print 'Listening on http://localhost:8888' 
    ioloop.IOLoop.current().run_sync(run) 

IOLoop.run_sync运行,直到你run方法退出。访问http://localhost:8888查看当前值i。在终端中按Ctrl-C结束程序。

+0

真棒。非常感谢您 –

+0

您是否会将我的答案标记为“已接受”或者我还能做些什么来帮助? –

+0

是的,对不起。我需要阅读SO文档,但我忘记标记它 –

0

听起来好像您希望您的Python应用程序包含响应外部请求的服务器,并且可以代表这些外部请求执行功能。这样做的一些方法包括在你的Python应用程序中嵌入一个完整的HTTP服务器来公开这种功能或嵌入一个轻量级的RPC服务器。由于听起来您想将此功能展示给其他应用程序,因此RPC方法可能更为合理。

就个人而言,我会建议使用protobufprotobuf-socket-rpc的组合。协议缓冲库使得在接口定义语言(协议缓冲区)中声明数据和RPC服务功能变得容易,并以Python,C++,Java和其他可以读写这种格式的数据的语言生成代码。协议缓冲区代码还会生成一个通用服务存根,可用于提供服务的实现。 protobuf-socket-rpc库允许您轻松创建一个导出服务实现的服务器,并创建一个远程/ rpc客户端,该客户端通过连接到提供服务实现的应用程序来执行。

+0

是的,你是对的。我打算使用Tornado Http服务器来实现这个目标,但仍然无法理解,如何使用它。 –