线程和IO访问中的Python无限循环

2024-05-04 11:43:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个设备,运行在带有Armbian的NanoPi板上。我的应用程序运行一个主循环,并使用Python内置的线程库运行一个单独的线程。它们都需要访问GPIO——一个轮询多个输入,另一个控制一些输出。我遇到了一个问题-当线程运行时,我的Python解释器返回一个错误:No access to /dev/mem. Try running as root!似乎一个线程一次可以访问/dev/mem(virtual?)文件。我该如何解决这个问题?我需要经常访问GPIO,因为我不想错过任何传入的脉冲

def impulse_counter():
    global counter

    while 1:

        if GPIO.event_detected(INPUT_1):
            print("Current cnt state: %d" % (counter))
            counter += 1

这在单独的模块中:

    input_counter = threading.Thread(target=mbox_io.impulse_counter)

    if __name__ == "__main__":
    
        input_counter.start()
    
        while 1:
            <Some long code is running here, irrelevant>
            mbox_io.red_off()   

Tags: iodev程序运行inputgpioifcounter线程
2条回答

只是一个猜测,但是对于非root用户来说,/dev/mem不是只读的吗? 如果是这样的话,当切换IOs的线程返回错误时,轮询器线程不是运行正常吗? {}显示了什么?作为root用户运行是否真的有帮助,因为您还没有说明这一点

我将把这篇文章作为一个答案,因为它太长了,不能发表评论

我不熟悉这个特定的系统和问题,但在很多情况下,无法从多个线程安全地访问某些内容。这通常意味着您必须重新设计应用程序

解决这些问题的一种可能方法是添加另一个线程,该线程处理与共享资源的所有通信。例如,您可以有一个队列,其中其他线程向GPIO线程提供“任务”,然后GPIO线程执行这些任务并在预期结果时返回结果。这会将共享资源限制为一个线程,而您仍然可以在其他线程中执行大量数据处理

由于各种原因,这可能不适用于您的应用程序

相关问题 更多 >