如何在Python中并行运行多个函数

3

我想接收串行数据,并根据数据进行通知。我的监视功能将持续监视串行数据。但是我面临的问题是,在我发出通告后,串行数据被监视,进程变慢。我想持续监视串行数据并并行地做出通知。线程是最好的选择吗?如何处理?

def announce(data):
   subprocess.call('espeak',data)

while 1:

    receiveddata= xbee.readline()  
    if receiveddata=='a1':
        announce("i am ok in room1")
    if receiveddata=='b2':
        announce("Urgently attend room 1")

使用线程包,一个线程来监视串行数据,一个线程来派生子进程。使用队列在两个线程之间进行通信就足够了。 - Ken Cheung
先生,我对线程编程还很陌生,如果您能给我提供一个示例,那将对我非常有帮助。 - Akash Nil
@KenCheung 我认为你的建议比下面Torxed提供的答案要好得多:只需创建一次宣布线程,然后让主线程通过队列将接收到的数据传递给宣布线程。为什么不写成完整的答案呢? - Pynchia
1个回答

1
from threading import Thread

def announce(data):
    subprocess.call('espeak',data)

class worker(Thread):
    def __init__(self, data):
        Thread.__init__(self)
        self.data = data

    def run(self):
        if receiveddata=='a1':
            announce("i am ok in room1")
        if receiveddata=='b2':
            announce("Urgently attend room 1")
        # at the end of run() the process will die.

while 1:
    receiveddata = xbee.readline()
    thread_handle = worker(receiveddata)
    thread_handle.start() # <- This starts the thread but keeps on going

这是一个骨架框架,可以用来实现Python的并行处理。它不完整,也不完美,但它会给你一个开始,并解决你的初始问题。
有很多有关线程和其他东西的“最佳实践”,我将让谷歌来解释和找到这些,因为总会有比我在这里提供的简短答案更好的解决方案。
需要知道的:
我尊重了您在Python中的新线程。
但正如下面的评论所讨论的那样,如果串口上有大量数据(将创建线程->执行工作->死亡),这将是一种资源密集型的解决方案。
还有更有效的线程解决方案(例如在整个程序中保持线程活动,并调用类中宣布的函数)。但这是您开始所需的最少量。
一旦您熟悉线程
我会在这里留下这些链接,供您从上述非常基本的示例中进行实验和发展您的线程知识。

使用队列进行工作


请遵循 PEP-8指南 的命名惯例来编写程序。 - Pynchia
receiveddata 变量在哪里被定义或赋值了? - Pynchia
@Pynchia data = xbee.readline(),我只是将recieveddata重命名为data并将其传递给类(该类将成为一个线程)。 - Torxed
@Pynchia,很抱歉,但我认为以大写字母开头的单词类很丑。这是一种品味问题,我尊重大多数人认为这很棒。但这就像宗教一样,如果我不喜欢,请不要强迫我接受,因为这会妨碍我的生产力,让我专注于对我来说不重要的事情。我知道这很自私,但如果我能够完成每天的工作,在这里帮助人们并成为导师,我会做我感到舒适的事情。然而,我通常会教人们遵循PEP指南,只是不适用于快速回答。 - Torxed
请看我对上面问题的评论。个人认为,有一种更优雅的解决方案,而不是在每次接收时创建一个线程,这是过度杀伤力的。这是一个经典的生产者-消费者情况。 - Pynchia
@Pynchia 绝对没错,创建一个带有调用公告的整洁功能的“活动线程”是理想的,但是您需要一个线程管理器来相应地终止线程以及其他一些事情。这是我能想到的最基本的框架,对于第一次使用者来说,这不是一个巨大的麻烦。如果没有他提出更多问题(考虑到您甚至问recieveddata在哪里定义,而它应该很明显),我无法使代码更容易理解。 - Torxed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接