首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python多处理JoinableQueue PicklingError

python多处理JoinableQueue PicklingError
EN

Stack Overflow用户
提问于 2014-06-23 10:57:12
回答 1查看 1.7K关注 0票数 0

Sorry...it似乎问了一个很受欢迎的问题,但我从堆栈流中找不到对我的情况有任何帮助的问题:P

因此,我的代码执行以下操作:

步骤1.父进程将任务对象写入multiprocessing.JoinableQueue

步骤2.子进程(多于1)从JoinableQueue读取(获取)任务对象并执行任务

我的模块结构是:

A.py

  • 类任务(对象)
  • 类WorkerPool(对象)
  • 阶级工作者(multiprocessing.Process)

代码语言:javascript
复制
- def run() # here the step 2 is executed

  • 类TestGroup()

代码语言:javascript
复制
- def loadTest()  # here the step 1 above is executed, i.e. append the object of Task

我所理解的是,当使用mp.JoinableQueue时,附加的对象应该是可选择的,我从https://docs.python.org/2/library/pickle.html#what-can-be-pickled-and-unpickled得到了“可选择”的含义。

我的问题是: 1.任务的对象在我的情况下是可选择的吗?

  1. 当代码将任务对象附加到JoinableQueue中时,我得到了下面的错误: 文件"/usr/lib/python2.6/multiprocessing/queues.py",第242行,在_feed中

2014-06-23 03:18:43 INFO TestGroup: G1末端负载测试: object1

2014-06-23 03:18:43 INFO TestGroup: G1末端负载测试: object2

2014-06-23 03:18:43 INFO TestGroup: G1末端负载测试: object3发送(Obj)

pysphere.resources.VimService_services_types.DynamicData_Holder :无法选择:属性查找失败

  1. mp.JoinableQueue的一般用法是什么?在我的例子中,我需要使用join()和task_done()
  2. 当我选择使用Queue.Queue而不是mp.JoinableQueue时,选择错误就消失了,但是,从日志中检查,我发现所有子进程都在处理队列的第一个对象,造成这种情况的可能原因是什么?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-24 02:30:32

Python中的multiprocessing模块启动多个进程来运行任务。由于进程不共享内存,因此它们需要能够使用序列化数据进行通信。多处理使用泡菜模块进行序列化,因此您要传递给任务的对象必须是可选择的。

1)您的任务对象似乎包含来自pysphere.resource.VimService_services_types的一个实例。这可能是对系统资源(例如打开的文件)的引用。这不能序列化或从一个进程传递到另一个进程,因此它会导致酸洗错误。

您可以使用mp.JoinableQueue将所需的参数传递给任务,并让它在任务本身中启动服务,使其成为该进程的本地服务。

例如:

代码语言:javascript
复制
queue = mp.JoinableQueue()
# not queue.put(task), since the new process will create the task
queue.put(task_args)

def f(task_args):
    task = Task(task_args)
    ...
    # you can't return the task, unless you've closed all non-serializable parts
    return task.result

process = Process(target=f, args=(queue,))
... 

2) Queue.Queue是用于线程处理的。它使用共享内存和同步机制来提供原子操作。但是,当您使用多进程启动一个新进程时,它会复制初始进程,因此每个子进程都将处理相同的队列对象,因为每个进程的内存中的队列都已被复制。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24364154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档