Python 如何同时使用asyncio模块调用nameko服务

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

我写了一个类似这样的异步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 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