Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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队列仅1项_Python_Multithreading - Fatal编程技术网

Python队列仅1项

Python队列仅1项,python,multithreading,Python,Multithreading,我只想储存一件物品(最新的)。我会这样做: thread 1: queue.queue.clear() queue.put (DATA, block = False, timeout = 2) thread 2: queue.get() 但是,如果线程2在线程1清除队列时同时获取,该怎么办 第二个想法是在获取后立即清除线程2队列,但我不希望队列增长,不知道线程2不下载时的大小 谢谢你的帮助 您希望在清除队列和将新值放入队列之间阻止其他任何人访问队列。您可以使用锁来完成此操作 lock = t

我只想储存一件物品(最新的)。我会这样做:

thread 1:
queue.queue.clear()
queue.put (DATA, block = False, timeout = 2)

thread 2:
queue.get()
但是,如果线程2在线程1清除队列时同时获取,该怎么办

第二个想法是在获取后立即清除线程2队列,但我不希望队列增长,不知道线程2不下载时的大小


谢谢你的帮助

您希望在清除队列和将新值放入队列之间阻止其他任何人访问队列。您可以使用锁来完成此操作

lock = threading.Lock()

def clear_and_put(queue):
    with lock.acquire():
        queue.clear()
        queue.put(DATA)

def get(queue):
    with lock.acquire():
        return queue.get()

如果thread1调用
clear\u和\u put
,它将立即获得锁,或者等待thread2调用
get
完成。一旦它获得了锁,任何对
get
的调用都将被阻塞,直到队列被更新并且锁被释放。

旁白:
()
之前的空间是什么?在任何情况下,都很难理解您所询问的内容的上下文,无论是线程2在清除之前的任何时间(甚至在清除之前)获取以前存储的项,还是在将其放入队列之后获取新项。这不能同时发生。我只想在队列中放置一个项目。解决方案是清除并放置单个原子操作,这样thread2对
get
的调用就不会在清除和放置之间发生。在thread1调用
clear
之前,thread2调用
get
,或者在thread1调用
put
之后,thread2调用
get
。第三个选项(get在clear和put之间调用)是不允许的。True,只要只有一个生产者线程就可以。