Python:是否有deque的线程安全版本?

时间:2017-09-08 00:54:16

标签: python multithreading collections thread-safety deque

我有一个由Consumer类和Producer类组成的线程程序。目前,我在实现中使用了Fifo queue.Queue,其中生产者put是队列末尾的数据,消费者get是它。

但是,我想添加一个功能,如果有必要的话,Consumer可以putget的项目(可能稍微修改过一点)归还Queue get的前面(以便deque返回的下一个项目是刚刚添加的项目,就像在堆栈中一样)。

我知道这可以通过append()来实现,但我已经阅读here它们对popleft()appendleft()只是线程安全的。出于上述目的,我还需要使用deque

是否存在具有deque功能的线程安全数据结构?如果没有,我可以在使用appendleft时通过放入自己的锁来使 using (DEntities Context = DAOHelper.GetObjectContext<DEntities>()) { Guid aspUserIdToRemove = Context.ExecuteStoreQuery<string>("Select UserId FROM aspnet_Users where UserName LIKE '%" + userName + "%'").ElementType.GUID; string aspUserId = aspUserIdToRemove.ToString(); aspUserId = aspUserId.Replace("{", string.Empty); aspUserId = aspUserId.Replace("}", string.Empty); Context .ExecuteStoreCommand("DELETE FROM aspnet_Membership where UserId = '" + aspUserId + "'"); Context .ExecuteStoreCommand("DELETE FROM aspnet_UsersInRoles where UserId = '" + aspUserId + "'"); Context .ExecuteStoreCommand("DELETE FROM aspnet_Users where UserId = '" + aspUserId + "'"); 线程安全吗?

2 个答案:

答案 0 :(得分:1)

这里是Deque作者。

  • 您感兴趣的操作都是原子操作。
  • 唯一的非原子操作是: remove() index() count clear()< / em>是由于可以进行纯python回调的相等性测试,还是由于decrefs可以触发任意python代码。

希望这会有所帮助:-)

答案 1 :(得分:0)

尽管某些deque功能不是线程安全的,但您应该尝试做的事情。

来自the docs

  

双端队列支持线程安全,内存高效的从双端队列的两侧追加并弹出