使用python对进程的异步请求

使用python对进程的异步请求,python,asynchronous,tornado,Python,Asynchronous,Tornado,我有一个关于对正在运行的进程的异步调用的问题。 例如,我有一个用python编写的程序。(称之为test.py) 现在,我运行test.py,然后我希望异步地向该进程发出web请求,并获取get_dict函数的值。 可能吗 我已经尝试使用tornado IOLoop,向test.py发出web请求 我在异步编程方面是绝对零的,我真的不清楚应该如何做。因此,我的问题可能会非常混乱。听起来您希望Python应用程序包含一个服务器,该服务器响应外部请求,并可以代表这些外部请求执行函数。实现这一点的一些

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

现在,我运行test.py,然后我希望异步地向该进程发出web请求,并获取get_dict函数的值。 可能吗

我已经尝试使用tornado IOLoop,向test.py发出web请求


我在异步编程方面是绝对零的,我真的不清楚应该如何做。因此,我的问题可能会非常混乱。

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


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

安装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\u sync
运行,直到您的
run
方法退出。访问
http://localhost:8888
查看
i
的当前值。点击终端中的Ctrl-C以结束程序。

问题似乎不是异步发出请求,而是异步响应请求。但是你需要发布更多关于服务器和客户端实际操作的详细信息。对不起,我没有添加wile LOOP是的,你是对的。我打算使用TornadoHTTP服务器来实现这个目标,但仍然不明白如何使用它。太棒了。非常感谢,对不起。我需要阅读这么多文档,但我忘了标记
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)