多进程和进程池的创建

1、使用多进程创建连两个子进程

import multiprocessing
import time

def test1():
    while True:
        print("------1-------")
        time.sleep(1)
def test2():
    while True:
        print("------2-------")
        time.sleep(1)

def main():
    p1 = multiprocessing.Process(target=test1)
    p2 = multiprocessing.Process(target=test2)
    p1.start()
    p2.start()
    print("-----main------")


if __name__=="__main__":
    main()

使用ps -aux查看所有进程状态,可以查看自己创建的python进程,使用kill PID可以销毁某个进程

2、使用队列实现进程间数据共享,(redis可以通过消息队列实现进程资源共享)

import multiprocessing
import time

def download_from_wed(q):
    # 模拟从网上下载的数据
    data = [11,22,33,44]

    # 向队列中写投入数据
    for temp in data:
        q.put(temp)

    print("---下载器已经下载完成数据并且存入队列中---")

def analysis_data(q):
    "数据处理"
    # 从队列中获取数据
    waitting_analysis = list()
    while True:
        data = q.get()
        waitting_analysis.append(data)

        if q.empty():
            break

    #  模拟数据处理
    print(waitting_analysis)
def main():
    # 1\创建一个队列
    q = multiprocessing.Queue()

    # 2\创建多个进程,将队列的引用当作实参进行传递
    p1 = multiprocessing.Process(target=download_from_wed,args=(q,))
    p2 = multiprocessing.Process(target=analysis_data,args=(q,))

    p1.start()
    p2.start()



if __name__=="__main__":
    main()

3、使用进程池实现多任务

from multiprocessing import Pool
import os,time,random

def worker(msg):
    t_start = time.time()
    print("%s开始执行,进程号为…%",(msg,os.getpid()))
    #random.random()随机种子生成0-1之间的浮点数
    time.sleep(random.random()*2)
    t_stop = time.time()
    print(msg,"执行完毕,耗时%0.2f"%(t_stop-t_start))


po = Pool(3)  # 定义一个进程池,最大进程数为3
for i in range(0,10):
    # Pool.apply_async(要调用的目标,(传递给目标的参数元组))
    # 每次循环将会用空闲出来的子进程去调用目标
    po.apply_async(worker,(i,))

print("---start---")
po.close() # 关闭进程池,关闭后po不再接受新的请求,不再让人家添加人物到进程了再join
po.join() # 等待po中所有的子进程执行完毕,必须放在close语句之后
print("---end---")

注意:创建子线程和子进程,主线程和主进程默认会等待子线程和子进程结束之后才结束,但是在进程池中,默认主进程不等待,所以需要再使用join()方法等待子进程结束。for循环是在向进程池中添加任务,当添加完成之后使用close()方法关闭其他请求,即该进程池不能再继续添加任务了,然后使用join()方法等待紫禁城执行完毕再结束。

下面看一下打印的进程ID号:注意到PID反复利用的都是只有三个,因为使用进程池创建的进程在入任务结束之前不会对进程进行销毁和重新创建而是重复利用一开始创建的进程,这样减小了进程重复销毁和创建的开销,加快执行任务。

---start---
%s开始执行,进程号为…% (0, 20599)
%s开始执行,进程号为…% (1, 20600)
%s开始执行,进程号为…% (2, 20601)
1 执行完毕,耗时0.91
%s开始执行,进程号为…% (3, 20600)
2 执行完毕,耗时1.41
%s开始执行,进程号为…% (4, 20601)
3 执行完毕,耗时0.71
%s开始执行,进程号为…% (5, 20600)
0 执行完毕,耗时1.67
%s开始执行,进程号为…% (6, 20599)
4 执行完毕,耗时0.96
%s开始执行,进程号为…% (7, 20601)
6 执行完毕,耗时0.97
%s开始执行,进程号为…% (8, 20599)
7 执行完毕,耗时0.29
%s开始执行,进程号为…% (9, 20601)
9 执行完毕,耗时0.46
5 执行完毕,耗时1.75
8 执行完毕,耗时1.95
---end---

 

你可能感兴趣的:(多进程和进程池的创建)