使用python对进程的异步请求

时间:2014-01-21 09:37:39

标签: python asynchronous tornado

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

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,然后我想异步地向该进程发出Web请求并获取get_dict函数的值。 有可能吗?

我曾尝试使用tornado IOLoop,向test.py发出网页请求

我在异步编程中绝对是零,并且真的没有一个清晰的想法,应该如何完成。因此,我的问题可能非常混乱。

2 个答案:

答案 0 :(得分:1)

安装Tornado并运行:

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结束程序。

答案 1 :(得分:0)

听起来您希望您的Python应用程序包含响应外部请求的服务器,并且可以代表这些外部请求执行功能。一些方法包括在Python应用程序中嵌入一个成熟的HTTP服务器以公开这种功能或嵌入更轻量级的RPC服务器。由于听起来您希望将此功能公开给另一个应用程序,因此RPC方法可能是更明智的方法。

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