use*_*018 11 python thread-safety deque
我无法确定以下双端队列是否是线程安全的.
简而言之,我创建了一个带有双端队列的类,它在新线程中每1秒显示一次其内容(因此在打印时不会暂停主程序).
deque是从主线程填充的,所以基本上应该有碰撞的机会.
但是,使用类方法填充deque,因此实际上它是从实例本身访问的,因此来自同一个线程.
这是简化的代码:
import threading
import time
from collections import deque
class MyQueue(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.q = deque()
self.start()
def run(self):
# pop out queue items every 1 sec
# (please ignore empty deque for now)
while True:
print self.q.popleft()
time.sleep(1)
def add_to_q(self, val):
# this function is called from outside
self.q.append(val)
# main
# fill the queue with values
qu = MyQueue()
for i in range(1:100):
qu.add_to_q(i)
Run Code Online (Sandbox Code Playgroud)
因此,虽然在实例中添加和删除队列中的项目,但是由于从实例外部调用添加函数,是否存在风险?
编辑:
因为我需要修改我的双端队列中的项目,所以我不得不使用Deque.我所做的是:roatate()到给定的项目,弹出它,修改,推回它并旋转()它回到它原来的位置.
除非我找到一种在队列中实现修改项目的方法,否则我将不得不坚持使用Deque
Kin*_*ing 17
Deque是线程安全的(http://docs.python.org/library/collections.html#deque-objects),用于来自对方的追加和弹出.在这里,文档只提到append()和popleft()是线程安全的.
Queue本身有一个线程安全的实现.所以你应该使用它,除非你有一些奇怪的要求.
Ray*_*ger 14
Deque 作者在这里。
该myQueue中()类看起来是正确的,我(至少相对于线程安全的问题)。
的追加()和popleft()方法都是原子的。
代码确实需要EAFP逻辑来处理输入为空的情况:
def run(self):
while True:
try:
print self.q.popleft()
except IndexError:
pass
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
小智 7
有关信息,有一个针对 deque 线程安全 ( https://bugs.python.org/issue15329 )引用的 Python 票证。
标题“阐明哪些双端队列方法是线程安全的”,底线是:
deque 的 append()、appendleft()、pop()、popleft() 和 len(d) 操作在 CPython 中是线程安全的。append 方法在末尾有一个 DECREF(对于已设置 maxlen 的情况),但这发生在所有结构更新和不变量恢复之后,因此可以将这些操作视为原子操作。
无论如何,如果您不是 100% 确定并且您更喜欢可靠性而不是性能,只需为print self.q.popleft()和添加一个类似的 Lock self.q.append(val);)
| 归档时间: |
|
| 查看次数: |
15635 次 |
| 最近记录: |