繁体   English   中英

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

[英]Python - infinite loops in threads and IO access

我有一个在带有 Armbian 的 NanoPi 板上运行的设备。 我的应用程序运行一个主循环,以及一个使用 Python 内置线程库的单独线程。 它们都需要访问 GPIO——一个轮询多个输入,另一个控制一些输出。 我遇到了一个问题 - 当线程运行我的 Python 解释器返回错误: No access to /dev/mem. Try running as root! No access to /dev/mem. Try running as root! 似乎一个线程一次可以访问 /dev/mem (虚拟?)文件。 我该如何解决? 我需要不断访问 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()   

我会将其发布为答案,因为评论太长了。

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

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

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

只是猜测,但 /dev/mem 对非 root 用户不是只读的吗? 如果是这样,轮询线程是否运行良好,而切换 IOs 的线程会返回该错误? ls -l /dev/mem显示什么? 并且以 root 身份运行确实有帮助,因为您没有说明这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM