python多机器并行_如何在多台机器上运行芹菜工人并行处理一组对象?

我在mongoDB集合中有几十万个文档可访问,这些文档遵循一个名为MyDoc的MongoEngine模式。每个文档都要运行一些东西(让我们称之为“我的操作”)。另外,我的操作需要(只读取,不改变)一个名为data_dict的有序dict,通过create_data_dict函数构造。我希望能够通过芹菜工人并行地运行我的操作。在

设置包括django,mongo,mongoengine和芹菜。在

选项1:@celery.task()

def my_operation(my_doc_list):

data_dict = create_data_dict()

for doc in my_doc_list:

do_something_to_doc(data_dict, doc)

doc.save()

def create_data_dict():

#blah blah blah

return data_dict

#So I run everything like this:

batch_size = len(MyDoc.objects)/no_of_celery_workers

for b in xrange(0, len(MyDoc.objects), batch_size):

my_operation.delay(MyDoc.objects[b:b+batch_size])

选项2:my_操作接受data-tu-dict和MyDoc实例

^{pr2}$

选项3:@celery.task()

def my_operation(my_doc):

data_dict = create_data_dict()

do_something_to_doc(data_dict, my_doc)

my_doc.save()

def create_data_dict():

#blah blah blah

return data_dict

#So I run everything like this:

celery.group([my_operation.s(my_doc) for my_doc in MyDoc.objects]).apply_async()

选项4:@celery.task()

def my_operation(my_doc):

data_dict = get_data_dict()

do_something_to_doc(data_dict, my_doc)

my_doc.save()

def create_data_dict():

#blah blah blah

return data_dict

def get_data_dict():

data_dict = cache.get("data_dict")

if data_dict is None:

data_dict = create_data_dict()

cache.set("data_dict", data_dict)

return data_dict

#So I run everything like this:

celery.group([my_operation.s(my_doc) for my_doc in MyDoc.objects]).apply_async()

如果选项1起作用,我可能不会问这个问题,但遗憾的是,我不能将queryset的响应片或querysets本身传递给芹菜工人,因为它们不可腌制。这就是回溯的意思。在

有了Option2,我会在每个任务中传递数据字典,这听起来不太吸引人。如果我在多台机器上运行celery workers,(我确实打算这样做)数据字典,基本上只需要传递一次,就会毫无价值地消耗大量网络。在

在Option3的情况下,每个文档都会重新创建数据字典,这似乎是对处理能力的巨大浪费。在

选项4:我使用缓存来备份数据字典,而不是重新计算或与每个文档一起重新传输。这听起来是最好的主意,但有一个陷阱。下一次我想对所有MyDocs执行“u”操作时,我希望重新计算数据字典,而不管它是否在缓存中。有没有办法做到这一点?在

问题是:

最好的办法是什么?在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,可以使用多种方法将for循环转换为并行处理,其中最常用的方法是使用多进程或多线程。下面是使用Python内置库multiprocessing和threading实现并行处理的示例代码: 1. 使用multiprocessing库实现并行处理: ```python import multiprocessing def process_data(data): # 处理数据的代码 pass if __name__ == '__main__': data_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] pool = multiprocessing.Pool() results = pool.map(process_data, data_list) pool.close() pool.join() ``` 在上面的示例代码中,首先定义了一个process_data函数,用于处理数据。然后定义了一个数据列表data_list,其中包含需要处理的数据。接着创建了一个进程池pool,并使用map方法将数据列表中的每个元素传递给process_data函数进行处理。最后关闭进程池并等待所有进程完成。 2. 使用threading库实现并行处理: ```python import threading def process_data(data): # 处理数据的代码 pass if __name__ == '__main__': data_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] threads = [] for data in data_list: thread = threading.Thread(target=process_data, args=(data,)) thread.start() threads.append(thread) for thread in threads: thread.join() ``` 在上面的示例代码中,同样首先定义了一个process_data函数,用于处理数据。然后定义了一个数据列表data_list,其中包含需要处理的数据。接着创建了多个线程,并将数据列表中的每个元素传递给process_data函数进行处理。最后等待所有线程完成。 需要注意的是,并行处理并不一定会比串行处理更快,因为并行处理需要消耗额外的系统资源,并且在处理时间较短的任务时,并行处理可能会增加额外的开销。因此,在使用并行处理时需要根据具体情况选择合适的方法和参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值