我有一个关于对正在运行的进程的异步调用的问题。 例如,我有一个用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发出网页请求
我在异步编程中绝对是零,并且真的没有一个清晰的想法,应该如何完成。因此,我的问题可能非常混乱。
答案 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方法可能是更明智的方法。
就个人而言,我建议使用protobuf和protobuf-socket-rpc的组合。协议缓冲库使得在接口定义语言(协议缓冲区)中声明数据和RPC服务功能变得容易,并生成Python,C ++,Java和其他可以以这种格式读/写数据的语言的代码。协议缓冲区代码还会生成一个通用服务存根,您可以使用它来提供服务的实现。 protobuf-socket-rpc库允许您轻松创建导出服务实现的服务器,以及创建通过与提供服务实现的应用程序建立连接来执行的远程/ rpc客户端。