Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为Python创建异步模式下的锁定/解锁机制_Javascript_Python_Promise_Async Await_Python Asyncio - Fatal编程技术网

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

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'关键字: 将

我在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'关键字:

将异步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内部运行(即,它调用来自事件循环线程的回调),那么您的“锁”将转换为asyncio
Future
,其使用方式与JavaScript
Promise
非常相似:

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内部运行(即,它调用来自事件循环线程的回调),那么您的“锁”将转换为asyncio
Future
,其使用方式与JavaScript
Promise
非常相似:

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.setWill
asyncio.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.setWill
asyncio.Event
在OP的代码中工作?socketio客户端示例通常以
sio.wait()
结尾,看起来它有自己的事件循环