跳出"无限循环的信号量对象"需要

时间:2016-12-06 10:31:37

标签: python multithreading raspberry-pi semaphore ros

我正在研究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

2 个答案:

答案 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