09、使用multiprocessing来完成多进程编程

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
输出顺序不固定,取决于完成的顺序

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值