Python多进程,通过from multiprocessing import Process实现
前提知识: 进程是python中最小的资源分配单元,也就是进程中间的数据,内存是不共享的,每启动一个进程,都要独立分配资源和拷贝访问的数据,所以进程的启动和销毁的代价是比较大了,下面这个方法就是每个进程都需要copy一份数据,占内存大。
总结:
1.进程池map(第二种方法)适合爬虫爬取多个链接和处理多个图片数据。作用的是可迭代对象里面的每一个子元素。
2.第一种方法多进程需要用到多份数据,占较多内存。但是可以对列表,元组等可迭代数据使用,Process(target=fun1,args=(data,))只需要修改这个代码,前面是函数,后面是对这个整体列表作用的函数。
测试代码
def fun1(name):
cour = name[0]
data = name[1]
print(f'测试{cour}多进程{data}')
if __name__ == '__main__':
process_list = []
for i in range(5): #开启5个子进程执行fun1函数
data = (['Python1'],[i])
p = Process(target=fun1,args=(data,)) #实例化进程对象
p.start()
process_list.append(p)
for i in process_list:
p.join()
print('结束测试')
另一种方法,进程池实现
import PIL
from multiprocessing import Pool
from PIL import Image
SIZE = (75,75)
SAVE_DIRECTORY = \'thumbs\'
def get_image_paths(folder):
return (os.path.join(folder, f)
for f in os.listdir(folder)
if \'jpeg\' in f)
def create_thumbnail(filename):
im = Image.open(filename)
im.thumbnail(SIZE, Image.ANTIALIAS)
base, fname = os.path.split(filename)
save_path = os.path.join(base, SAVE_DIRECTORY, fname)
im.save(save_path)
if __name__ == \'__main__\':
folder = os.path.abspath(
\'11_18_2013_R000_IQM_Big_Sur_Mon__e10d1958e7b766c3e840\')
os.mkdir(os.path.join(folder, SAVE_DIRECTORY))
images = get_image_paths(folder)
pool = Pool()
pool.map(creat_thumbnail, images) #关键点,images是一个可迭代对象
pool.close()
pool.join()