#python跨平台进程multiprocessing模块
#1.创建进程
import multiprocessing
def do(n):
name = multiprocessing.current_process().name
print("当前进程名:",name)
print("当前是第%s个进程" %n)
if __name__ == "__main__":
numlist = []
for i in range(5):
print("生成子进程")
p = multiprocessing.Process(target=do,args=(i,))
print("生成完成")
numlist.append(p)
p.start()
#p.join()
print("Done")
print(numlist)
#join()表示等待子进程结束后再继续往下执行,通常用于进程间同步
#2.多进程模板程序
import multiprocessing
def func1(n):
result = 0
for i in range(n):
result += i
return result
def func2(n):
result = 0
for i in range(n):
result -= i
return result
if __name__ == "__main__":
p1 = multiprocessing.Process(target=print(func1(100)),name="p1")
p2 = multiprocessing.Process(target=print(func2(100)),name="p2")
p1.start()
p2.start()
p1.join()
p2.join()
print("Done")
#2.进程池
import multiprocessing
def func(n):
print(multiprocessing.current_process())
return n*n
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
print(pool.map(func,range(18)))
#3.测试单进程和多进程程序执行的效率
import multiprocessing
import time
def func(n):
time.sleep(0.01)
return n*n
if __name__ == "__main__":
pool = multiprocessing.Pool(multiprocessing.cpu_count())
star_time = time.time()
pool.map(func,range(1000))
print("多进程耗时:",time.time()-star_time)
start_time = time.time()
list(map(func,range(1000)))
print("单进程耗时:",time.time()-star_time)
#多进程耗时: 1.5492820739746094
#单进程耗时: 12.274648666381836
#实现给map中的函数传递多个参数
import multiprocessing
class Person:
def __init__(self,a,b):
self.a = a
self.b = b
def func(obj):
return obj.a * obj.b
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
params = [Person(i,i) for i in range(10)]
print(pool.map(func,params))
#统计目录下文件中字符数和行数
#要求:并行统计指定目录下所有文件(.txt/.py)中的字符数和行数,
#将结果写入res.txt文件中,每个文件一行
#格式: filename:lineNumber,charNumber
import multiprocessing
import os
def count(filename):
with open(filename,encoding="utf-8") as fp:
lines = fp.readlines()
char_num = 0
for line in lines:
char_num += len(line.strip())
result = filename+":"+str(len(lines))+","+str(char_num)+"\n"
return result
if __name__ == "__main__":
filename_list = []
for root,dirs,files in os.walk("d:\\2019"):
for file in files:
path = os.path.join(root,file)
if os.path.splitext(path)[1] in [".txt",".py"] :
filename_list.append(path)
print(filename_list)
pool = multiprocessing.Pool(processes=4)
r = pool.map(count,filename_list)
print(r)
with open("d:\\2019\\res.txt","w",encoding="utf-8") as fp:
fp.writelines(r)