gpt4 book ai didi

python - 在 Python 中同时执行两个类方法

转载 作者:太空狗 更新时间:2023-10-29 20:28:03 27 4
gpt4 key购买 nike

我敢肯定之前已经问过很多类似的问题,但是在阅读了很多之后我仍然不太确定我应该做什么。所以,我有一个 Python 脚本来控制一些外部仪器(相机和功率计)。我通过使用 ctypes 调用 .dll 文件中的 C 函数为这两种仪器编写了类。现在它看起来像这样:

for i in range(10):
power_reading = newport.get_reading(N=100,interval=1) # take power meter reading
img = camera.capture(N=10)
value = image_processing(img) # analyze the img (ndarray) to get some values
results.append([power_reading,value]) # add both results to a list

我想同时开始执行前两行。 newport.get_readingcamera.capture 都需要大约 100ms-1s 的运行时间(如果我选择正确的参数,它们将同时运行)。我不需要它们完全同时启动,但理想情况下,延迟应该小于总运行时间的大约 10-20%(因此,当每次运行大约 1 秒时,延迟小于 0.2 秒)。根据我的阅读,我可以使用 multiprocessing 模块。所以我基于这个 post 尝试了类似的东西:

def p_get_reading(newport,N,interval,return_dict):
reading = newport.get_reading(N,interval,return_dict)
return_dict['power_meter'] = reading

def p_capture(camera,N,return_dict):
img = camera.capture(N)
return_dict['image'] = img

for i in range(10):
manager = multiprocessing.Manager()
return_dict = manager.dict()
p = multiprocessing.Process(target=p_capture, args=(camera,10))
p.start()
p2 = multiprocessing.Process(target=p_get_reading, args=(newport,100,1))
p2.start()
p.join()
p2.join()
print(return_dict)

我有一些问题/疑问:

  1. 我需要从两个函数调用中获取返回值。使用我目前的方法,return_dict 只显示 capture_img 的条目,但不显示功率计读数,这是为什么?它还读到我可以使用 Queue,对于我当前的目的,最好的方法是什么?

  2. 我如何知道这两个函数是否确实同时开始运行?我正在考虑使用 time 模块来记录两个函数的开始和结束时间,也许使用一些包装函数来记录时间,但是使用 multiprocessing 有任何限制吗?

  3. 我通常在 IDE (spyder) 上运行我的代码,据我所知,我需要在命令提示符下运行以查看输出(我在函数中有一些打印语句用于调试目的)。我仍然可以在 IDE 中运行以同时运行这两个功能吗?

最佳答案

使用 Lock 可能有助于同步:

import multiprocessing

def p_get_reading(newport, N, interval, lock, return_dict):
lock.acquire()
lock.release()
reading = newport.get_reading(N, interval)
return_dict['power_meter'] = reading

def p_capture(camera, N, lock, return_dict):
lock.acquire()
lock.release()
img = camera.capture(N)
return_dict['image'] = img

if __name__ == "__main__":
for i in range(10):
manager = multiprocessing.Manager()
return_dict = manager.dict()
lock = multiprocessing.Lock()
lock.acquire()
p = multiprocessing.Process(target=p_capture, args=(camera,10,lock,return_dict))
p.start()
p2 = multiprocessing.Process(target=p_get_reading, args=(newport,100,1,lock,return_dict))
p2.start()
lock.release()
p.join()
p2.join()
print(return_dict)

这两个 Process 对象现在可以按任意顺序创建和 start(),因为主例程已经获得了锁。一旦释放,这两个进程将相互竞争以获取和释放锁,并几乎同时准备就绪。

另外,请注意 if __name__ == "__main__" 的使用,因为这有助于 multiprocessing 创建新进程。

我必须说这似乎是对 Lock 的滥用

关于python - 在 Python 中同时执行两个类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48623544/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com