繁体   English   中英

尝试运行进程时出现泡菜错误

[英]Getting a pickle error when trying to run processes

我想做的是一次在不同进程中运行质数分解列表。 我有一个工作的线程版本,但似乎无法使其与流程一起工作。

import math
from Queue import Queue
import multiprocessing

def primes2(n):
    primfac = []
    num = n
    d = 2
    while d * d <= n:
        while (n % d) == 0:
            primfac.append(d) # supposing you want multiple factors repeated
            n //= d
        d += 1
    if n > 1:
        primfac.append(n)
    myfile = open('processresults.txt', 'a')
    myfile.write(str(num) + ":" + str(primfac) + "\n")
    return primfac

def mp_factorizer(nums, nprocs):
    def worker(nums, out_q):
        """ The worker function, invoked in a process. 'nums' is a
            list of numbers to factor. The results are placed in
            a dictionary that's pushed to a queue.
        """
        outdict = {}
            for n in nums:
            outdict[n] = primes2(n)
        out_q.put(outdict)

    # Each process will get 'chunksize' nums and a queue to put his out
    # dict into
    out_q = Queue()
    chunksize = int(math.ceil(len(nums) / float(nprocs)))
    procs = []

    for i in range(nprocs):
        p = multiprocessing.Process(
                target=worker,
                args=(nums[chunksize * i:chunksize * (i + 1)],
                      out_q))
        procs.append(p)
        p.start()

    # Collect all results into a single result dict. We know how many dicts
    # with results to expect.
    resultdict = {}
    for i in range(nprocs):
        resultdict.update(out_q.get())

    # Wait for all worker processes to finish
    for p in procs:
        p.join()

    print resultdict

if __name__ == '__main__':

    mp_factorizer((400243534500, 100345345000, 600034522000, 9000045346435345000), 4)

我收到如下所示的泡菜错误:

错误图片

任何帮助将不胜感激 :)

您需要使用multiprocessing.Queue而不是常规Queue +更多

这是由于该方法不使用运行相同的内存空间和有某些对象不是可拣选 ,像常规的队列Queue.Queue )。 为了克服这个问题, multiprocessing库提供了一个Queue类,该类实际上是Queue的Proxy

而且,您也可以像其他任何方法一样提取def worker(..这可能是您的主要问题,因为在OS级别上如何“分叉”进程。

您还可以使用multiprocessing.Manager + more

动态创建的功能不能进行酸洗,因此不能被用作目标Process ,函数worker需要在全球范围内,而不是定义内的被限定mp_factorizer

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM