8-6 如何使用多进程
解决方案:
使用标准库中的multiprocessing.Process,它可以启动子进程执行任务
操作接口,进程间通信,进程间同步都与threading.Thread类似
由于GIL 锁的存在,对于CPU 密集型的任务,python多线程发挥不出多cpu的优势
使用多进程,系统确实会生成两个进程,并且两个进程分别会去占用两个CPU,真正意义上实现多线程调度
from multiprocessing import Process
def f(s):
print s
p = Process(target=f,args=('hello',))
p.start()
from multiprocessing import Queue,Pipe
q = Queue()
q.put(1)
q.get()
def f(q):
print 'start'
print q.get()
print 'end'
Process(target=f,args=(q,)).start()
q.put(1000)
def f(c):
c.send(c.recv() * 2)
c1,c2 =Pipe()
Process(target = f,args(c2,)).start()
c1.send(55)
c1.recv()
from threading import Thread
from multiprocessing import Process
def isArmStrong(n):
a,t = [], n
while t > 0:
a.append(t % 10)
t /= 10
k = len(a)
return sum(x ** k for x in a) == n
def findArmStrong(a,b):
print a,b
res = [ k for k in xrange(a, b) if isArmStrong(k)]
print "%s - %s :%s"%(a,b,res)
def findByThread(*argslist):
workers = []
for args in argslist:
worker = Thread(target = findArmStrong,args=args)
workers.append(worker)
worker.start()
for t in workers:
t.join()
def findByProcess(*argslist):
workers = []
for args in argslist:
worker = Process(target=findArmStrong,args=args)
workers.append(worker)
worker.start()
for work in workers:
worker.join()
if __name__ == '__main__':
import time
start = time.time()
findByProcess((20000000,25000000),(25000000,30000000))
findByThread((20000000,25000000),(25000000,30000000))
print time.time() - start