【问题标题】:Python - multithreading / multiprocessingPython - 多线程/多处理
【发布时间】:2013-04-03 02:18:00
【问题描述】:

背景
我有一组用于构建和执行 Verilog-AMS 测试台的 Python 脚本。整体设计是在考虑线程的情况下构建的,因为每个主要测试用例都是它自己的测试平台,并且我为每个实例分别提供了所有支持文件/数据输出。唯一共享的项目将是启动器脚本和我的数据提取脚本。我面临的问题是我的 Verilog-AMS 模拟器本身不支持多线程,并且对于我的测试用例,它需要大量时间才能完成。

问题
我正在运行它的机器有 32GiB 的 RAM 和 8 个“核心”可供我使用,我可能能够访问具有 32 个的机器。我想利用可用的计算能力并同时执行模拟.最好的方法是什么?

我目前使用subprocess.call 来执行我的模拟。我想一次最多执行n 命令,每个命令都在单独的线程上执行/作为单独的进程。一旦模拟完成,队列中的下一个(如果存在)将执行。

我对 Python 还很陌生,还没有真正编写过线程应用程序。我想要一些关于我应该如何进行的建议。我看到this 的问题,我认为multiprocessing 模块可能更适合我的需求。

你们都推荐什么?

【问题讨论】:

    标签: python multithreading multiprocessing verilog


    【解决方案1】:

    我过去曾在机器学习和数据挖掘方面做过一些类似的任务。在您的情况下使用multiprocessing 可能不是那么困难的任务。这取决于您热衷于制作程序的容忍度,您可以使用 Threaded Pool 模式。我个人最喜欢的是 Producer - Consumer 模式使用Queue,这种设计可以处理各种复杂的任务。这是一个使用multiprocessing的示例玩具程序:

    import multiprocessing
    from multiprocessing import Queue, Process
    from Queue import Empty as QueueEmpty
    
    # Assuming this text is very very very very large
    text="Here I am writing some nonsense\nBut people will read\n..."
    
    def read(q):
       """Read the text and put in a queue"""
       for line in text.split("\n"):
           q.put(line)
    
    def work(qi, qo):
       """Put the line into the queue out"""
       while True:
            try:
                data = qi.get(timeout = 1) # Timeout after 1 second
                qo.put(data)
            except QueueEmpty:
                return # Exit when all work is done
            except:
                raise # Raise all other errors
    
    def join(q):
        """Join all the output queue and write to a text file"""
        f = open("file.txt", w)
        while True:
             try:
                f.write(q.get(timeout=1))
             except QueueEmpty:
                f.close()
                return
             except:
                raise
    
    def main():
       # Input queue
       qi = Queue()
       # Output queue
       qo = Queue()
       # Start the producer
       Process(target = read, args = (qi, )).start()
       # Start 8 consumers
       for i in range(8):
            Process(target = work, args = (qi, qo, )).start()
       # Final process to handle the queue out
       Process(target = join, args = (qo, )).start()
    

    凭记忆输入,如有错误请更正。 :)

    【讨论】:

    • 谢谢,这有帮助。你知道这在使用subprocess.call 执行外部命令时是否会很好地发挥作用,这样队列中的每个项目都需要执行一个外部命令,例如program_name.exe -arguments
    • 我还没有尝试结合subprocessmultiprocessing;但是,只要您正确处理subprocess 中的通信,我认为这不会有问题。我在this question 中看到了两者的实现。这似乎是您正在寻找的东西。
    • 谢谢,这很有帮助!我认为在你的帖子和那个帖子之间,我应该都准备好了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多