Python 多处理示例。永不终止
Python Multiprocessing example. never terminates
我是 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()
你的第一个 while 循环:
while i<=max:
if n%i==0:
return False
永远不会终止。您既没有增加 i
也没有减少 max
,因此如果条件评估为真,它将始终为真。为什么即使在 while 循环中它也应该只是 if 语句。
如上所述,你的问题是第一个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()
我是 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()
你的第一个 while 循环:
while i<=max:
if n%i==0:
return False
永远不会终止。您既没有增加 i
也没有减少 max
,因此如果条件评估为真,它将始终为真。为什么即使在 while 循环中它也应该只是 if 语句。
如上所述,你的问题是第一个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()