我正在研究Raspberry Pi 2上的一个rospy项目。 pyhton脚本需要在收到消息时启动一个线程并循环它直到收到另一个消息。 但由于这些线程需要访问硬件,因此每次收到新消息时,旧线程都应该停止。 我构建了自己的锁定系统,但在充满消息时失败了。 现在我正在研究信号量,但要么我不太了解它们是如何工作的,要么我需要别的东西,但类似于信号量。
目前我的代码如下:
def some_thread():
# lock_int is 0 when noone uses the hardware, 1 when another thread uses it
global lock_int
# my way of signaling that I want to get the Hardware access
lock_int += 1
# wait until other thread releases Hardware
while(lock_int > 1):
wait()
# loop until some other thread requests hardware
while(lock_int < 2)
do_hardware_stuff()
# release hardware
lock_int -= 1
如果我想用信号量做这个,我需要do_hardware_stuff循环中的某种信号来查看请求。 像这样:
def semaphore_thread():
# blocking request, waits until other thread releases
semaphore.acquire()
# loop until some other thread requests hardware
while(semaphore.got_request() != True)
do_hardware_stuff()
# release hardware
semaphore.release()
有没有办法可以使用这样的信号量或类似对象?
谢谢, ChTe
答案 0 :(得分:0)
您可以启动更多线程并使用threading.Lock
进行线程同步。
例如:
import threading
lock = threading.Lock()
def semaphore_thread():
lock.acquire()
try:
do_hardware_stuff()
finally:
lock.release()
答案 1 :(得分:0)
我通过使用Queue来修复硬件作业。 我在队列周围设置了一个锁,以避免从不同的地方同时编辑队列。 我保留了lock_int机制,但是因为我在从队列中开始新作业之前运行了一个kill thread函数, 我可以保证只有一份工作正在运行。
def kill_thread():
global lock_int
lock_int += 1
while(lock_int > 1):
wait()
lock_int -= 1