为Python创建异步模式下的锁定/解锁机制



我在JS中有这个new_lock函数,它有助于避免回调地狱:

function new_lock(){
var unlock,lock = new Promise((res,rej)=>{ unlock=res; });
return [lock,unlock];
}
var [lock,unlock] = new_lock();
call_some_func_with_callback(data,function(){
print(1);
print(2);
unlock();
});
await lock;
print(3)

这是我的异步Python主函数,在里面使用'await'关键字:

import asyncio as aio
def new_lock():
?How to put code here?
return lock,unlock
async main():
lock,unlock = new_lock()
def cb(ackdata):
print(1)
print(2)
unlock()
# Python web server emits to client side (browser)
socketio.emit("eventname",data,callback=cb)
await lock
print(3)
if __name__=="__main__":
loop = aio.get_event_loop()
t = loop.create_task(main())
loop.run_until_complete(t)

如何在JS中创建相当于"new_lock"函数的Python?甚至是Python中必需的new_lock函数?

为什么不使用socket.io的AsyncClientAsyncServer类,而只使用await sio.emit()

如果做不到这一点,您将寻找一个Event异步原语:

import asyncio as aio
async main():
ev = aio.Event()
def cb(ackdata):
print(1)
print(2)
ev.set()
await socketio.emit("eventname",data,callback=cb)
await ev.wait()
print(3)

您没有展示如何设置和运行socketio库。如果socketio在asyncio内部运行(即它从事件循环线程调用回调(;锁定";转换为异步Future,使用方式与JavaScriptPromise:大致相同

def new_lock():
loop = asyncio.get_event_loop()
fut = loop.create_future()
def unlock():
fut.set_result(None)
return fut, unlock

如果socketio没有在asyncio内部运行,即如果它在一个单独的线程中运行,它将从该线程调用传递给emit的回调,那么以上内容是不够的。在这种情况下,您需要使用线程感知调用来唤醒事件循环,并告诉它设置未来的结果:

def new_lock():
loop = asyncio.get_event_loop()
fut = loop.create_future()
def unlock():
loop.call_soon_threadsafe(fut.set_result, None)
return fut, unlock

使用异步模块的Python的new_lock函数

import asyncio as aio
def new_lock():
event = aio.Event()
return event.wait(),event.set
async def main():
lock,unlock = new_lock()
...
await lock
...

最新更新