我有一份工作,我可以完成很多单独的任务。对于每项任务,我都需要下载一些数据,对其进行处理,然后再次上传。
我正在使用多处理池进行处理。
我有几个我不确定的问题。
首先,数据大约可以达到 20MB,理想情况下,我希望将其传递给子工作进程,而无需将其物理移动到内存中,并将生成的数据也返回到父进程而不移动它。由于我不确定某些工具是如何在幕后工作的,所以我不知道我是否可以将数据作为参数传递给池apply_async
(据我所知,它会序列化对象,然后在到达时再次创建它们子进程?),或者我应该使用多处理Queue
还是mmap
可能?或者是其他东西?
我查看了ctypes 对象,但据我所知,只有在可以共享进程分叉时创建池时定义的对象?这对我没有好处,因为我会不断收到需要分享的新数据。
我不需要担心的一件事是对数据的任何并发访问,因此我不需要任何类型的锁定。这是因为只有在下载数据后才会开始处理,而上传也只会在生成输出数据后开始。
我遇到的另一个问题是,有时进来的任务可能会激增,因此我下载任务数据的速度比子进程处理它的速度要快。因此,我下载数据的速度比我完成任务和处理数据的速度要快,python 因内存不足而死亡。当内存几乎已满/作业管道中有太多数据时,在下载阶段暂停任务的好方法是什么?我正在考虑通过使用数据字节数来计算某种类型的“参考”计数,这样我就可以限制下载和上传之间的数据量,并且只有在数字低于某个阈值时才下载。虽然我会担心孩子有时可能会失败,但我永远无法将其拥有的数据排除在外。有没有实现这种事情的好方法?