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