Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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-可以从特定线程解锁信号量吗?_Python_Multithreading_Semaphore - Fatal编程技术网

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

我几周前出于学习目的开始学习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 (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饿死)。如果你告诉我们你的基本情况是什么,建议可能看起来会大不相同。使用线程同步很容易走错方向,但对它所带来的所有风险知之甚少。好吧,我要这么做!我把我的问题告诉了我的老师,他也告诉了我和你一样的事情,所以我确信你做得很好!谢谢,这不是关于我的代表,而是关于你没有做出错误的决定;-)