Python-可以从特定线程解锁信号量吗?
我几周前出于学习目的开始学习Python。 我想知道是否可以从特定线程解锁信号量获取。或者还有其他工具吗Python-可以从特定线程解锁信号量吗?,python,multithreading,semaphore,Python,Multithreading,Semaphore,我几周前出于学习目的开始学习Python。 我想知道是否可以从特定线程解锁信号量获取。或者还有其他工具吗 import threading, time sem = threading.Semaphore def thread1 (threadname): #Code to do #Condition thread1 time.sleep(0.001) sem.acquire() #Code 1 sem.release def thread2
import threading, time
sem = threading.Semaphore
def thread1 (threadname):
#Code to do
#Condition thread1
time.sleep(0.001)
sem.acquire()
#Code 1
sem.release
def thread2 (threadname):
while (thread1.is_alive() == True):
if #Condition thread1
sem.acquire()
#Code 2
sem.release
我在线程1中的状态正好在time.sleep之前(因此线程2有时间使用.acquire
)阻止线程1)。如果我没有时间睡觉,结果是不一致的。
我现在得到了很好的结果,但是我希望我的线程2总是在线程1开始“代码1”之前开始它的“如果”,这样我就可以删除time.sleep(0.001)
,并获得一致的结果
你知道吗?你要求同步启动行为。因此,您当前使用的信号量不合适。您编写的代码清楚地表明,您不关心先运行哪个进程。这也是处理事情的标准方式,因此,如果您需要先有一个线程,然后再有另一个线程,那么可能需要一种不同的同步机制。如果我能更多地了解你潜在的欲望,我可以告诉你更多 然而,基于当前代码,您想要实现的是使用第二种机制,在第一个线程尝试获取信号量之前阻塞第一个线程,并且在第二个线程进入其关键代码块(e)后由第二个线程释放。Ga
线程。事件
:
#/usr/bin/env蟒蛇3
导入线程,时间
信号量=线程。信号量()
event=threading.event()
event.clear()
def action1():
打印(“起始线程1”)
睡眠时间(0.1)
打印(“正在线程中等待1…”)
event.wait()
打印(“在线程1中醒来!”)
打印(“获取线程1…”)
semaphore.acquire()
打印(“线程1中的关键”)
semaphore.release()
打印(“离开线程1”)
def action2():
打印(“起始线程2”)
而(线程[0]。是否处于活动状态()):
打印(“获取线程2…”)
semaphore.acquire()
打印(“线程2中的关键”)
event.set()
睡眠时间(0.1)
semaphore.release()
打印(“在thread2中发布”)
打印(“留线2”)
threads=[threading.Thread(target=action1),
线程(目标=action2)]
对于线程中的线程:
thread.start()
对于线程中的线程:
thread.join()
但在我看来,这似乎很粗糙,容易出错。如果您告诉我们您真正想要实现的目标,您最初试图解决的问题,答案可能会有很大改进。谢谢,因为您的解决方案非常适合!在这种情况下,您可以投票和/或接受答案;但是读最后两句话。我仍然觉得给你一个不好的建议(例如,我的代码只会在任意时间后终止,因为thread2很容易让thread1饿死)。如果你告诉我们你的基本情况是什么,建议可能看起来会大不相同。使用线程同步很容易走错方向,但对它所带来的所有风险知之甚少。好吧,我要这么做!我把我的问题告诉了我的老师,他也告诉了我和你一样的事情,所以我确信你做得很好!谢谢,这不是关于我的代表,而是关于你没有做出错误的决定;-)