【问题标题】:Python Multiprocessing example. never terminatesPython 多处理示例。永不终止
【发布时间】:2015-05-28 16:58:03
【问题描述】:

我对 Python 多处理相当陌生,我遇到了一个教程,因此尝试检查它的多处理。这里的进程没有被终止。他们永远在奔跑。怎么了。?我读到当可选参数为真时,进程不会终止。因此我在那里放了空的声明。但该过程仍然没有终止。请指教。谢谢。我使用的机器有 Python 2.7.6 这是我的代码

from multiprocessing import Process
from Queue import Empty,Queue
import math
def isprime(n):
    if not isinstance(n,int):
            raise TypeError("argument is not of int type")
    if n<2:
            return False
    if n==2:
            return True
    max= int(math.ceil(math.sqrt(n)))
    i=2
    while i<=max:
            if n%i==0:
                    return False
    return True
def sum_primes(n):
    return sum([x for x in xrange(2,n) if isprime(x)])
def do_work(q):
    while True:
            try:
                    x=q.get(block=False)
                    print sum_primes(x)
            except Empty:
                    break
if __name__=="__main__":
    work_queue=Queue()
    for i in range (100000,5000000,100000):
            work_queue.put(i)
    processes=[Process(target=do_work, args=(work_queue,)) for i in range(8)]
    for p in processes:
            p.start()
    for p in processes:
            p.join()

【问题讨论】:

  • 尝试通过在调用 producer.start() 之前添加 producer.daemon = True 使您的进程成为守护进程,并查看脚本是否会退出

标签: python multiprocessing terminate


【解决方案1】:

你的第一个 while 循环:

while i<=max:
    if n%i==0:
        return False

永远不会终止。您不会增加i 也不会减少max,因此如果条件评估为真,它将始终为真。为什么即使在while循环中它也应该只是if语句。

【讨论】:

    【解决方案2】:

    如上所述,您的问题是第一个 while 循环。这是您的代码的简化版本,它修复了 while 循环问题,似乎可以执行您想要的操作,并且还有多进程(使用池而不是队列):

    import multiprocessing as mp
    import math
    def isprime(n):
        if not isinstance(n,int):
            raise TypeError("argument is not of int type")
        if n<2:
            return False
        if n==2:
            return True
        max= int(math.ceil(math.sqrt(n)))
        i=2
        while i<=max:
            if n%i==0:
                return False
            else:
                i += 1
        return True
    def sum_primes(n):
        return = sum([x for x in xrange(2,n) if isprime(x)])
    
    if __name__=="__main__":
        jobs = range(100000,500000,100000)
        pool = mp.Pool()
        post = pool.map(sum_primes, jobs)
        pool.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多