我想在Python中创建一个在我的代码的主要执行运行时不断并行运行的进程。它应该提供一种方法来处理 Python 的顺序执行,从而阻止我进行异步执行。
所以我希望在我的主代码正在执行其他操作时运行一个函数 RunningFunc
。
我尝试使用threading
模块。然而,计算并不是并行的,并且 RunningFunc
是一个高度密集的计算,并且严重减慢了我的主代码的速度。
我还尝试使用multiprocessing
模块,我想这应该是我的答案,使用multiprocessing.Manager()
在第一个进程上进行一些计算,同时通过共享内存随时间计算的数据。但我没有找到一种方法来做到这一点。
例如,RunningFunc
正在递增 Compteur
变量。
def RunningFunc(x):
boolean = True
Compteur = 0
while boolean:
Compteur +=1
在我的主代码中,一些计算正在运行,并且我有时会调用(不一定是每次 while other_bool
迭代),RunningFunc
的 Compteur
变量>.
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/