01、引子 --
--这个例子是为了说明,进程之间资源不是共享的,会单独开辟空间
--记住:如果父进程提前结束,其启动的子进程无法退出会造成资源占用等一系列问题,所以阻塞非常重要同时一次启动的总进程数也非常重要
import os
import time
# fork函数只在Linux/unix系统中起作用
pid = os.fork() # 启动进程,将父进程中代码资源内存原封不动复制一份,并开辟新的空间进行执行
print('liming')
if pid == '0':
print('父进程为:{}, 子进程为:{}'.format(os.getppid(), os.getpid()))
else:
print('我是父进程:{}'.format(pid))
time.sleep(2)
***************** 打印结果 *******************
# 这里父进程的执行
liming
我是父进程:24774
# 这是子进程的执行
liming
父进程为:24773, 子进程为:24774
02、multiprocessing 启动多进程:基本启动 一个子进程 一个主进程
--这里强调的是:ProcessPoolExecutor多进程池是执行多进程的首选,接下来要讲的multiprocessing是相对而言差一点的方式启动多进程
--multiprocessing启动多进程示例:
--这里启动一个子进程 ,即两个进程 一个主进程 一个子进程
--代码如下:
import multiprocessing
import time
def get_time(n):
time.sleep(n)
print('sub process success!')
return n
if __name__ == '__main__':
# 这里需要说明的是,windows下还是应该在if __name__ == '__main__': 下执行多进程
process01 = multiprocessing.Process(target=get_time, args=(0.1, ))
process01.start()
# 打印进程pid
print('打印进程id: {}'.format(process01.pid))
process01.join()
print('main process end')
03、multiprocessing 启动多进程:使用进程池的方式启动多进程任务
--使用multiprocessing中的进程池启动多个进程:
--如果不声明进程个数会默认启动和cpu个数相等的进程数,或者是1
if processes is None:
processes = os.cpu_count() or 1
--使用进程池调用启动函数:
import multiprocessing
import time
def get_time(n):
time.sleep(n)
print('sub process success!')
return n
if __name__ == '__main__':
# 指明数量: 这里就指定为cpu的个数
pool = multiprocessing.Pool(multiprocessing.cpu_count())
# 类似于Future未来对象,存放的也是进程执行结果和状态
# 返回的是ApplyResult对象
result = pool.apply_async(get_time, args=(2,))
# 记住这里必须提前调用 pool.close()方法,使得在启动pool之前不再接受新的进程
pool.close()
# 阻塞进程,等待子进程全部执行完毕
pool.join()
# 打印结果
print(str(result.get()))
04、multiprocessing 启动多进程:使用进程池中imap方法启动
import multiprocessing
import time
def get_time(n):
print('sub {} process success!'.format(n))
return n
if __name__ == '__main__':
# 指明数量: 这里就指定为cpu的个数
pool = multiprocessing.Pool(multiprocessing.cpu_count())
# 使用imap启动, 尽管执行顺序不一致,但是返回结果和输入参数一致
# 说明了:即利用了多进程的效率优势,又解决了输出顺序混乱的问题
for res in pool.imap(get_time, [1, 3, 5, 7, 9]):
print(res)
******************* 输出结果 *******************
1
3
5
7
9
输出顺序和参数输入顺序一致
05、multiprocessing 启动多进程:使用进程池中 imap_unordered
import multiprocessing
import time
def get_time(n):
print('sub {} process success!'.format(n))
return n
if __name__ == '__main__':
# 指明数量: 这里就指定为cpu的个数
pool = multiprocessing.Pool(multiprocessing.cpu_count())
# 使用imap_unordered启动, 谁先完成就先输出谁
for res in pool.imap_unordered(get_time, [1, 3, 5, 7, 9]):
print(res)
******************* 输出结果 *******************
9
3
7
1
5
输出顺序不固定,取决于完成的顺序