Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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
Python 3.x 当不同事件循环中的协程访问公共代码时,是否需要使用asyncio.Lock 背景_Python 3.x_Synchronization_Python Asyncio_Event Loop - Fatal编程技术网

Python 3.x 当不同事件循环中的协程访问公共代码时,是否需要使用asyncio.Lock 背景

Python 3.x 当不同事件循环中的协程访问公共代码时,是否需要使用asyncio.Lock 背景,python-3.x,synchronization,python-asyncio,event-loop,Python 3.x,Synchronization,Python Asyncio,Event Loop,我继承了使用多个事件循环来处理对使用websockets.service创建的多个对象的读/写的代码。这些协同程序需要访问一个公共列表 脚本 事件循环X中的协同路由A 事件循环Y中的协同路由B 问题 我是否需要保护对公用列表的访问 如果我确实需要保护对列表的访问,asyncio.Lock()就足够了吗 我假设事件循环并行运行,每个循环都在自己的线程中。在这种情况下,您将像对待不同线程之间共享的数据一样对待共享数据。具体而言: 这将取决于您对列表所做的操作。如果一个线程正在读取,而另一个线程正

我继承了使用多个事件循环来处理对使用websockets.service创建的多个对象的读/写的代码。这些协同程序需要访问一个公共列表

脚本
  • 事件循环X中的协同路由A
  • 事件循环Y中的协同路由B
问题
  • 我是否需要保护对公用列表的访问
  • 如果我确实需要保护对列表的访问,asyncio.Lock()就足够了吗

  • 我假设事件循环并行运行,每个循环都在自己的线程中。在这种情况下,您将像对待不同线程之间共享的数据一样对待共享数据。具体而言:

  • 这将取决于您对列表所做的操作。如果一个线程正在读取,而另一个线程正在调用类似于
    append
    的东西,则不需要同步,因为您受GIL保护。但是,如果您正在执行更复杂的操作,例如删除读卡器线程指示的项目,则需要锁定以确保不会由于并发修改而丢失项目

  • asyncio.Lock
    绝对不是正确的锁定设备,因为它设计用于一个事件循环,即单线程。不能使用
    线程.Lock
    ,因为它是非异步的,会阻塞整个事件循环。您可能可以使用
    loop.call_soon\u threadsafe
    在事件循环之间进行同步,但这并非小事


  • 您继承的代码使用asyncio的方式不符合预期,您可能会遇到问题。由于asyncio事件循环设计为可扩展到任意数量的任务,因此我建议重构代码以使用单个事件循环。然后您将不需要特殊的同步,因为等待之间的任何代码都会自然形成一个关键部分,如果您需要在等待之间锁定,您可以使用为该用例创建的
    asyncio.Lock

    我假设事件循环并行运行,每个循环都在自己的线程中。在这种情况下,您将像对待不同线程之间共享的数据一样对待共享数据。具体而言:

  • 这将取决于您对列表所做的操作。如果一个线程正在读取,而另一个线程正在调用类似于
    append
    的东西,则不需要同步,因为您受GIL保护。但是,如果您正在执行更复杂的操作,例如删除读卡器线程指示的项目,则需要锁定以确保不会由于并发修改而丢失项目

  • asyncio.Lock
    绝对不是正确的锁定设备,因为它设计用于一个事件循环,即单线程。不能使用
    线程.Lock
    ,因为它是非异步的,会阻塞整个事件循环。您可能可以使用
    loop.call_soon\u threadsafe
    在事件循环之间进行同步,但这并非小事


  • 您继承的代码使用asyncio的方式不符合预期,您可能会遇到问题。由于asyncio事件循环设计为可扩展到任意数量的任务,因此我建议重构代码以使用单个事件循环。然后您将不需要特殊的同步,因为等待之间的任何代码都会自然形成一个关键部分,如果您需要在等待之间锁定,您可以使用为该用例创建的
    asyncio.Lock

    嗨,我很好奇我的答案是否解决了您的问题?嗨,我很好奇我的答案是否解决了您的问题?