为每个流程划分for循环

时间:2016-07-06 18:38:40

标签: python multithreading multiprocessing

我有这段代码:

def loop():
    alphabet = string.digits + string.letters
    for key in itertools.product(alphabet, repeat=6):
    ...

我使用此代码使用4个进程:

if __name__ == '__main__':
    jobs = []
    for i in range(4):
        p = multiprocessing.Process(target=loop)
        jobs.append(p)
        p.start()

现在..这将只运行整个函数4次,我需要以某种方式将工作负载分成4并自己运行每个进程,所以在这种情况下我需要将我生成的字符拆分为4个不同的零件......例如:

处理1工作量

100101102103

处理2工作量

104105106107

处理3工作量

108109110111

处理4工作量

112113114115

我认为你应该明白我想做什么..

我尝试循环并且只是扔掉但是当使用大量字符时它会变得非常慢..如果我有1,000,000行并且处理器名称是4,它将循环750,000次而不做任何事情并处理下一个250,000,如果处理器名称是3 ..它将循环500,000次,处理下一个250k并完成75000,这样浪费了很多计算能力:/

2 个答案:

答案 0 :(得分:1)

当您致电Process时,您需要预先划分工作量 并将其传递给您的函数。一般来说,这可能是一个难题,但在您的情况下,由于您只是生成笛卡尔积,因此它非常简单 - 只需切掉第一个字符并将其单独附加即可。

即。而不是生成repeat=6,而是使用repeat=5并自己迭代第一个字母的可能性,将每个字母传递给一个单独的进程。

例如:

def loop(first, sequence):
    for seq in sequence:
        key = first + seq
        ....

并将其命名为:

alphabet = ...
for letter in alphabet:
    p = Process(target=loop, args=(letter, itertools.product(alphabet, repeat=5))
    # etc.

这将在您的字母表中为每个字母生成一个进程;你可以通过传递第一个角色的范围来完成四个分裂或其他类似的事情。

答案 1 :(得分:0)

听起来每个任务只需要少量数据,因此请尝试使用multiprocessing.Pool创建a pool of workers。它将启动一个工作进程池,并向每个工作程序发送一大块项目。使用imap_unordered之类的内容将所有输入组合映射到其结果中。