python - 运行 Python 时在进程之间交换对象

标签 python parallel-processing python-multiprocessing shared-memory

我想在Python中创建一个在我的代码的主要执行运行时不断并行运行的进程。它应该提供一种方法来处理 Python 的顺序执行,从而阻止我进行异步执行。

所以我希望在我的主代码正在执行其他操作时运行一个函数 RunningFunc

我尝试使用threading模块。然而,计算并不是并行的,并且 RunningFunc 是一个高度密集的计算,并且严重减慢了我的主代码的速度。

我还尝试使用multiprocessing模块,我想这应该是我的答案,使用multiprocessing.Manager()在第一个进程上进行一些计算,同时通过共享内存随时间计算的数据。但我没有找到一种方法来做到这一点。

例如,RunningFunc 正在递增 Compteur 变量。

def RunningFunc(x):
    boolean = True
    Compteur = 0
    while boolean:
       Compteur +=1

在我的主代码中,一些计算正在运行,并且我有时会调用(不一定是每次 while other_bool 迭代),RunningFuncCompteur 变量>.

other_bool = True
Value = 0
while other_bool:
   ## MAKING SOME COMPUTATION
    Value = Compteur # Call the variable compteur that is constantly running
   ## MAKING SOME COMPUTATION

最佳答案

有很多方法可以在子进程中进行处理。哪个最好取决于要共享的数据大小与计算所花费的时间等问题。以下是一个非常类似于变量的简单增量的示例,但刷新为稍大的整数列表以突出显示您将遇到的一些问题。

multiprocessing.Manager 是在进程之间共享数据的便捷方法,但它不是特别快,因为它需要在进程之间同步数据。如果您想要共享的数据相当有限并且不经常更改,那么它是一个不错的选择。但我在这里只关注共享内存。

大多数Python对象无法在共享内存中创建。像对象头、引用计数或内存堆之类的东西是不可共享的。有些对象,特别是 numpy 数组可以被共享,但这是一个不同的答案。

您可以做的是序列化并写入/读取共享内存。这可以通过任何序列化机制来完成,但通过 struct 转换为基本类型是一个很好的方法。

这意味着您必须编写代码来定期保存其数据。如果您要将大于单个 CPU 级字的内容保存到内存中,您还需要担心同步问题。 parent 可以在 child 写作时阅读,从而提供不一致的数据。

以下示例显示了处理共享内存的一种方法:

import multiprocessing as mp
import multiprocessing.shared_memory
import time
import struct

data_format = struct.Struct("3Q") # will share 3 longlong ints

def main():
    # lock keeps shared memory readers from getting intermediate data
    shared_lock = mp.Lock()
    shared = mp.shared_memory.SharedMemory(create=True, size=8*3)
    buf = shared.buf
    try:
        print(shared)
        child = mp.Process(target=running_func, args=(shared.name, shared_lock))
        child.start()
        try:
            print("read for 20 seconds")
            for i in range(20):
                with shared_lock:
                    my_list = data_format.unpack_from(buf, 0)
                print(my_list)
                time.sleep(1)
        finally:
            child.terminate()
            child.join()
    finally:
        shared.close()
        shared.unlink()


def running_func(shared_memory_name, lock):
    shared = mp.shared_memory.SharedMemory(name=shared_memory_name)
    buf = shared.buf
    try:
        my_list = [1,2,3]
        while True:
            my_list = [val+1 for val in my_list]
            with lock:
                data_format.pack_into(buf, 0, *my_list)
    finally:
        shared.close()

if __name__ == "__main__":
    main()

关于python - 运行 Python 时在进程之间交换对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71834379/

相关文章:

python - 程序如何在python中的两个函数之间进行选择?

用于线程间通信的邮箱的 C++ 实现

python - 如何使用 Python 多进程 apply_async 获得精确的超时?

python - 从python中的字符串中删除前导文本字符

python - 检查标签是否在网格管理器中

python - 为什么将 'pip' 作为 Python 3 模块而不是作为脚本运行?

linux - 在 Linux 上快速连接多个文件

opencv - 使用 OpenCV 进行并行 GPU 计算

python - 如何继承multiprocessing.Pipe?

python - 在python进程之间共享tkinter窗口对象