2015-05-28 3 views
1

Я довольно новичок в Python Multiprocessing, и я наткнулся на учебник и, следовательно, попытался проверить его многопроцессорность. Здесь процессы не прекращаются. они бегут навсегда. что не так.? Я читал, что, когда необязательные аргументы верны, процесс не заканчивается. поэтому я поставил там пустое заявление. но процесс все же не заканчивается. Пожалуйста, порекомендуйте. Благодарю. Машина я использую имеет Python 2.7.6 Вот мой кодПример многопроцессорности Python. никогда не заканчивается

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() 
+0

пытаются сделать свои процессы демонами путем добавления producer.daemon = True перед вызовом функции create.start() и посмотреть, выйдет ли скрипт – haifzhan

ответ

4

Ваш первый во время цикла:

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

никогда не кончится. Вы не увеличиваете i и не уменьшаете max, поэтому, если условие оценивает true, оно всегда будет истинным. Почему это даже в цикле while это просто оператор if.

2

Как уже упоминалось выше, ваша проблема - это первый цикл while. Вот упрощенная версия кода, который устраняет проблему время цикла, кажется, делать то, что вы хотите его, а также multiprocesses (с бассейном вместо очереди):

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() 
Смежные вопросы