这是并发处理中最简单的一种情况。应用场景当然也很简单。一般会是这样:通过传递不同的参数,让同一个函数在同一时间内执行几种不同的任务,达到多任务并行的效果,提升吞吐量。
我们有这样一个要求:分别往2个文件中写入百W级数据,在串行状态下的脚本是这样的:
【code-1】
import time
'''
写文件
'''
def write_file(filename,num):
target = open(filename, 'w')
for i in range(1,num+1):
target.write("%d line\n" % i)
if __name__ == '__main__':
start = time.time()
#100W
write_file('1.txt', 1000000)
#200W
write_file('2.txt', 2000000)
end = time.time()
print str(round(end-start,3))+'s'
在我的机器上运行结果输出是:
6.557s
那么如果用多进程的方式呢:
【code-2】
import time
import multiprocessing
def write_file(filename,num):
target = open(filename, 'w')
for i in range(1,num+1):
target.write("%d line\n" % i)
if __name__ == '__main__':
start = time.time()
p1 = multiprocessing.Process(target=write_file,args=('1.txt', 1000000))
p2 = multiprocessing.Process(target=write_file,args=('2.txt', 2000000))
#启动子进程
p1.start()
p2.start()
#等待fork的子进程终止再继续往下执行,可选填一个timeout参数
p1.join()
p2.join()
end = time.time()
print str(round(end-start,3))+'s'
输出结果:3.418s
这个例子说明了如何以单独进程的形式创建和启动函数。有时候更习惯想把它定义成一个对象。像下面这样:
【code-3】
import time
import multiprocessing
'''
新的类继承自Process类
'''
class Write_file(multiprocessing.Process):
def __init__(self,filename,num):
multiprocessing.Process.__init__(self)
self.filename = filename
self.num = num
def run(self):
target = open(self.filename, 'w')
for i in range(1,self.num+1):
target.write("%d line\n" % i)
if __name__ == '__main__':
start = time.time()
p1 = Write_file('1.txt', 1000000)
p2 = Write_file('2.txt', 1000000)
p1.start()
p2.start()
p1.join()
p2.join()
end = time.time()
print str(round(end-start,3))+'s'
当然,例程2和3是完全等价的。