我想同时控制和运行两个实验室设备(至少同时启动它们(,所以我使用多处理模块。
from myLabModule import Newport1936R
from myLabModule import DCx_camera
from multiprocessing import Process, Queue
def multiprocess_camera(camera, shots_per_img, queue, delay):
time.sleep(delay)
img, camera_time = camera.capture(shots_per_img, np.float64, True) #img is a 2x2 ndarray
results = [camera_time[0], camera_time[1], img, 'img']
queue.put(results)
def multiprocess_power(newport, interval, N, queue, delay):
time.sleep(delay)
power_reading, newport_time = newport.get_power(interval, N, True)
results = [newport_time[0], newport_time[1], power_reading, 'power']
queue.put(results)
if __name__ == "__main__":
thorcam = DCx_camera()
newport = Newport1936R()
queue = Queue()
p1 = Process(target=multiprocess_camera, args=(thorcam,10,queue,0))
p2 = Process(target=multiprocess_power, args=(newport,1,10,queue,0))
p1.start()
p2.start()
p1.join()
p2.join()
results = []
results.append(queue.get())
results.append(queue.get())
运行代码时,我会收到以下错误:AttributeError: Can't pickle local object 'CDLL.__init__.<locals>._FuncPtr'
。我阅读了这篇文章,看来它与变量的范围有关(我将在另一个模块中定义的两个classess传递给函数,而函数基本上运行了类的方法(。我不确定哪个部分导致了问题。我应该如何修改代码以使其正常工作?
在这种情况下,将执行参数将其传递给target
方法时,将执行为新的(儿童(进程。
确切地说,我不确定DCx_camera
和Newport1936R
的腌制实例是否可以。取决于这些类是如何定义的,但是我想您不能看错误消息。这就是为什么您可以尝试完全不传递这些参考。在示例中,您似乎不需要。
这是我期望的:
from myLabModule import Newport1936R
from myLabModule import DCx_camera
from multiprocessing import Process, Queue
def multiprocess_camera(shots_per_img, queue, delay):
camera = DCx_camera()
time.sleep(delay)
img, camera_time = camera.capture(shots_per_img, np.float64, True) #img is a 2x2 ndarray
results = [camera_time[0], camera_time[1], img, 'img']
queue.put(results)
def multiprocess_power(interval, N, queue, delay):
newport = Newport1936R()
time.sleep(delay)
power_reading, newport_time = newport.get_power(interval, N, True)
results = [newport_time[0], newport_time[1], power_reading, 'power']
queue.put(results)
if __name__ == "__main__":
queue = Queue()
p1 = Process(target=multiprocess_camera, args=(10,queue,0))
p2 = Process(target=multiprocess_power, args=(1,10,queue,0))
p1.start()
p2.start()
p1.join()
p2.join()
results = []
results.append(queue.get())
results.append(queue.get())
这是可以为您带来理想结果的东西吗?
根据此链接有替代方案。
继承比泡菜/untickle
更好但是,通常应该避免 使用管道或队列将共享对象发送到其他过程。 相反,您应该安排程序,以便需要一个需要的过程 访问在其他地方创建的共享资源可以从一个 祖先过程。
这就是为什么我认为您甚至可以具有参考DCx_camera
和Newport1936R
的全局变量,然后在两个目标方法中使用这些变量。