- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Python 中有这个示例,它演示了条件变量的使用。
import logging
import threading
import time
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s (%(threadName)-2s) %(message)s',)
def consumer(cond):
# wait for the condition and use the resource
logging.debug('Starting consumer thread')
t = threading.currentThread()
cond.wait()
logging.debug('Resource is available to consumer')
def producer(cond):
# set up the resource to be used by the consumer
logging.debug('Starting producer thread')
logging.debug('Making resource available')
cond.notifyAll()
condition = threading.Condition()
# pass each thread a 'condition'
c1 = threading.Thread(name='c1', target=consumer, args=(condition,))
c2 = threading.Thread(name='c2', target=consumer, args=(condition,))
p = threading.Thread(name='p', target=producer, args=(condition,))
# start two threads and put them into 'wait' state
c1.start()
c2.start()
# after two seconds or after some operation notify them to free or step over the wait() function
time.sleep(2)
p.start()
但是,它会在线程上引发运行时错误un-acquired lock
。我有一个想法,我需要使用 acquire
和 release
函数,但我不确定它们的用法以及它们究竟做了什么。
最佳答案
条件是围绕提供等待/通知功能的底层 Lock
的包装器。您需要先获取
一个锁,然后才能释放它 - wait
在后台执行此操作。值得注意的是,一旦它被重新唤醒,它就会重新获取锁。因此,在获取和释放之间确保了互斥,如果有意义的话,wait
“让出”锁的控制权。
与其手动获取/释放,不如使用 Condition
作为上下文管理器:
def consumer(cond):
with cond:
cond.wait()
logging.debug('Resource is available to consumer')
如果出于某种原因你被困在没有上下文管理器的 python 版本上,这等同于:
def consumer(cond):
try:
cond.acquire()
cond.wait()
finally:
cond.release()
logging.debug('Resource is available to consumer')
通常您希望确保只有一个消费者被唤醒,因此经常使用以下成语:
with cond:
while some_queue.isEmpty():
cond.wait()
#get one from queue
因此,您可以通知
任意数量的消费者,一旦队列为空,多余的消费者就立即返回休眠状态。
关于python - 线程条件变量 : un-acquired lock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23116383/
condition.acquire(threading.Condition()) 是否类似于lock.acquire(threading.Lock)。两者都可以访问锁吗?我可以使用condition.
我正在尝试执行一个非常基本的示例,演示 accumulate() 的使用Drools 的函数,但出现 java.lang.NullPointerException 异常。 代码如下: Metric.j
我是java初学者,我正在尝试信号量。我尝试编写一个具有编写器和读取器的代码,我只尝试使用 acquire() 和 release(): 1) If a writer is writing, then
我的一个程序中有一个奇怪的问题,一个线程获取一个条件,而另一个线程告诉我没有获取该条件。 为了知道线程是否获得了条件,我做了一些调试信息,看起来是的,他做到了。但是另一个线程告诉我条件没有获得。 这是
我的类(class)有一个互斥锁,定义如下: ACE_Mutex m_specsMutex; 当我使用不带参数的 acquire() 方法时,一切正常。但是当我将它与时间值一起使用时(如下所示),它会
我使用 QSharedMemory 和 QSystemSemaphore 来组织多个进程之间的事件交换。 QSharedMemory 存储接收者的数量和事件数据。接收者在 QSystemSemapho
我正在为我的 REST 服务编写一个 API 库。在某些时候,访问 token 将需要更新。我正在尝试实现一种线程安全的方法来执行此操作,以便仅发送一个更新请求,即使多个线程可能想要同时更新它。 这是
我正在我的node.js 项目中使用MySQL 数据库。我用 Knex 创建了一个数据库查询,结果没问题。但是当我再次尝试查询时,出现此错误: Error: Unable to acquire a c
以下锁定机制用于防止 cron 作业并发运行: #!/bin/bash echo "Before critical section" ( flock -e 200 echo "In c
在 Python 3.4.3 上,我无法理解 threading.Lock.acquire() 如何阻塞,直到锁定状态设置为解锁。 threading.Lock 似乎是上面链接的 _dummy_thr
我有一段代码 locked = lock.acquire(False) if locked: break 根据 python 文档: lock.aquire(False):-
-Thread 1- y.store (20, memory_order_release); x.store (10, memory_order_release); -T
我最近在运行测试时遇到了这个错误。我在本地 MongoDB 服务器 (4.0.5) 上试过了,我也在 Mongo Atlas 上试过了,但遇到了同样的问题。 我尝试增加锁定超时,但没有效果。 我不确定
在Windows平台上,TCriticalSection是通过调用Windows API EnterCriticalSection/LeaveCriticalSection来实现的。 Microsof
我为我的数据库使用 mssql ( https://www.npmjs.com/package/mssql ) 模块。通常我使用导致 pg ( https://www.npmjs.com/packag
我在 Python 中有这个示例,它演示了条件变量的使用。 import logging import threading import time logging.basicConfig(level=
我希望我的应用保持 CPU 运行但关闭屏幕以最大限度地减少电力浪费。 关于此主题的先前帖子建议采用以下方法: mPm = (PowerManager) getSystemService(Con
是否可以在 C#.NET 应用程序中请求 Windows 7 PC 上的管理权限? 我希望能够通过 Click Once 部署应用程序,并让用户使用它来执行管理任务(在本例中,它正在为主应用程序编写注
我正在更新 Delphi (Delphi 2009) 代码,它专门使用 TCriticalSection.Acquire/Release 对,而不是 Enter/Release 或 Leave 对。我
我试图理解使用条件变量时丢失唤醒的问题。我相信我已经使用了下面正确的设计模式。消费者: lock the mutex while the condition is not satisfied
我是一名优秀的程序员,十分优秀!