Python 如何同时使用asyncio模块调用nameko服务
我写了一个类似这样的异步IO程序。永久运行循环同时启动4个事件。每个事件都将运行Python 如何同时使用asyncio模块调用nameko服务,python,python-3.x,rpc,python-asyncio,nameko,Python,Python 3.x,Rpc,Python Asyncio,Nameko,我写了一个类似这样的异步IO程序。永久运行循环同时启动4个事件。每个事件都将运行rpc服务。在nameko服务中,我使用time.sleep(10)实现该服务 我搞不懂为什么每10秒就要完成一次服务。我想服务应该同时结束。我怎样才能让工作同时完成 def start_loop(loop): asyncio.set_event_loop(loop) loop.run_forever() async def job(x): try: with Cluste
rpc
服务。在nameko
服务中,我使用time.sleep(10)
实现该服务
我搞不懂为什么每10秒就要完成一次服务。我想服务应该同时结束。我怎样才能让工作同时完成
def start_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
async def job(x):
try:
with ClusterRpcProxy(CONFIG) as rpc:
res = rpc.helloworldService.helloworld(x)
print(res)
except Exception as e:
print(f"{e}")
async def do_sleep(x, queue):
try:
await job(x)
queue.put("ok")
except Exception as e:
print(f"{e}")
def consumer():
asyncio.run_coroutine_threadsafe(do_sleep('10', queue), new_loop)
asyncio.run_coroutine_threadsafe(do_sleep('11', queue), new_loop)
asyncio.run_coroutine_threadsafe(do_sleep('12', queue), new_loop)
asyncio.run_coroutine_threadsafe(do_sleep('13', queue), new_loop)
if __name__ == '__main__':
print(time.ctime())
new_loop = asyncio.new_event_loop()
loop_thread = Thread(target=start_loop, args=(new_loop,))
loop_thread.setDaemon(True)
loop_thread.start()
CONFIG = {'AMQP_URI': "amqp://guest:guest@localhost"}
queue = Queue()
sema = asyncio.Semaphore(2)
consumer_thread = Thread(target=consumer)
consumer_thread.setDaemon(True)
consumer_thread.start()
while True:
msg = queue.get()
print("current:", time.ctime())
nameko
rpc
服务是:
class HelloWorld:
name = 'helloworldService'
@rpc
def helloworld(self,str):
time.sleep(10)
return 'hello_'+str
输出如下:
hello_10
current: Sat Jan 26 13:04:57 2019
hello_11
current: Sat Jan 26 13:05:07 2019
hello_12
current: Sat Jan 26 13:05:17 2019
hello_13
current: Sat Jan 26 13:05:28 2019
您必须使用可等待的睡眠,而不是不可等待的time.sleep()
。因此,您的nameko
RPC服务如下所示:
import asyncio
class HelloWorld:
name = 'helloworldService'
@rpc
async def helloworld(self,str): # Note
await asyncio.sleep(10) # Note
return 'hello_'+str
和服务器代码的一部分:
async def job(x):
try:
with ClusterRpcProxy(CONFIG) as rpc:
res = await rpc.helloworldService.helloworld(x) # Note
print(res)
except Exception as e:
print(f"{e}")
[注]
- 但是您的RPC库也应该通过
asyncio
实现
- 这是一个异步
asyncio
RPC库()
您的作业
函数不包含等待
,因此它不能与任何其他函数并行运行。您需要切换到支持异步调用的RPC库。@user10970428使用aiorpc
而不是nameko
?