Javascript 为Python创建异步模式下的锁定/解锁机制
我在JS中有一个新的_lock函数,它有助于避免回调地狱:Javascript 为Python创建异步模式下的锁定/解锁机制,javascript,python,promise,async-await,python-asyncio,Javascript,Python,Promise,Async Await,Python Asyncio,我在JS中有一个新的_lock函数,它有助于避免回调地狱: function new_lock(){ var unlock,lock=newpromise((res,rej)=>{unlock=res;}); 返回[锁定,解锁]; } var[lock,unlock]=new_lock(); 使用_回调调用_some _func _(数据,函数(){ 印刷品(1); 印刷品(2); 解锁(); }); 等待锁; 印刷品(3) 这是我的异步Python主函数,在其中使用'await'关键字: 将
function new_lock(){
var unlock,lock=newpromise((res,rej)=>{unlock=res;});
返回[锁定,解锁];
}
var[lock,unlock]=new_lock();
使用_回调调用_some _func _(数据,函数(){
印刷品(1);
印刷品(2);
解锁();
});
等待锁;
印刷品(3)
这是我的异步Python主函数,在其中使用'await'关键字:
将异步IO导入为aio
def new_lock():
?如何在此处放置代码?
返回锁,解锁
异步main():
锁定,解锁=新锁定()
def cb(确认数据):
印刷品(1)
印刷品(2)
解锁()
#Python web服务器发送到客户端(浏览器)
emit(“eventname”,data,callback=cb)
等待锁
印刷品(3)
如果名称=“\uuuuu main\uuuuuuuu”:
loop=aio.get\u event\u loop()
t=loop.create_任务(main())
循环。运行_直到_完成(t)
如何在JS中创建“new_lock”函数的Python等价物?或者甚至是Python中需要的新的锁定函数?您没有展示如何设置和运行
socketio
库。如果socketio在asyncio内部运行(即,它调用来自事件循环线程的回调),那么您的“锁”将转换为asyncioFuture
,其使用方式与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
您不会显示如何设置和运行
socketio
库。如果socketio在asyncio内部运行(即,它调用来自事件循环线程的回调),那么您的“锁”将转换为asyncioFuture
,其使用方式与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
为什么不直接使用或分类,然后直接使用
否则,您将查找异步原语:
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)
为什么不直接使用或分类,然后直接使用
否则,您将查找异步原语:
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)
我使用asyncio模块为Python提供的新的_锁函数
将异步IO导入为aio
def new_lock():
event=aio.event()
返回event.wait(),event.set
异步def main():
锁定,解锁=新锁定()
...
等待锁
...
使用asyncio模块的Python新锁定函数
将异步IO导入为aio
def new_lock():
event=aio.event()
返回event.wait(),event.set
异步def main():
锁定,解锁=新锁定()
...
等待锁
...
“甚至是Python中需要的新锁定函数?”我不确定JS中是否需要该函数。参见编辑:尽管我不得不承认,这是一个非常聪明的实现。在技术层面上,我确实喜欢它,但是Promisify回调优于Promisify回调,因为您可以立即使用整个promise API,包括Wait
。还有一些库用于提示回调。“甚至是Python中需要的新的_lock函数?”我不确定JS中是否需要该函数。参见编辑:尽管我不得不承认,这是一个非常聪明的实现。在技术层面上,我确实喜欢它,但是Promisify回调优于Promisify回调,因为您可以立即使用整个promise API,包括Wait
。还有一些库用于实现回调。我的客户端不是python,它是浏览器中的javascript,js库来自我的理解,但你的问题是关于使用Socket.io库的异步python代码,你正在尝试用Socket.io对async client.tks做的事,aio.Event()足够简单,lock=ev.wait()和unlock=ev.setWillasyncio.Event
是否在OP的代码中工作?socketio客户端示例通常以sio.wait()
结尾,看起来它有自己的事件循环。我在socketio.emit之前添加了'wait',它工作了。我的客户端不是python,它是浏览器中的javascript,js库来自我的理解,但你的问题是关于使用Socket.io库的异步python代码,您正试图像Socket.io对async client.tks所做的那样,aio.Event()足够简单,lock=ev.wait(),unlock=ev.setWillasyncio.Event
在OP的代码中工作?socketio客户端示例通常以sio.wait()
结尾,看起来它有自己的事件循环