python基础语法九-多进程和多线程

书接上回:

python基础语法一-基本数据类型

python基础语法二-多维数据类型

python基础语法三-类

python基础语法四-数据可视化

python基础语法五-函数

python基础语法六-正则匹配

python基础语法七-openpyxl操作excel

python基础语法八-异常

1. 多进程

1.1 创建多进程

1)import multiprocessing模块

2)创建进程要执行的函数

3)调用multiprocessing.Process(target=函数名,args=(函数要传入的参数)) #只有一个参数时,后面要加一个逗号

4)p.start()启动进程

5)p.join()等待进程结束

1.1

import multiprocessing

import os

def fun1(a):

    print('id = {0}'.format(os.getpid()))

    print('a = {0}'.format(a))

if __name__ == '__main__':

    p1 = multiprocessing.Process(target=fun1, args=(5,))

    p2 = multiprocessing.Process(target=fun1, args=(6,))

    p1.start()

    p2.start()

    p1.join()

    p2.join()

1.2 queue

1)作用:将每个进程执行的结果存放到queue里,最后所有进程结束后从queue里拿出结果。

2)用法:

(1)通过multiprocessing.Queue()创建q

(2)将q作为第一个参数传入到multiprocessing.Process()里

(3)通过q.put(结果)将结果放入q里

(4)在进程结束后通过q.get()拿出结果 #先放入的结果会被先拿出来

例1.2

import multiprocessing

import os

def fun1(q, a):

    print('id = {0}'.format(os.getpid()))

    print('a = {0}'.format(a))

    q.put(a)

if __name__ == '__main__':

    q = multiprocessing.Queue()

    p1 = multiprocessing.Process(target=fun1, args=(q,5))

    p2 = multiprocessing.Process(target=fun1, args=(q,6))

    p1.start()

    p2.start()

    p1.join()

    p2.join()

    res1 = q.get()

    res2 = q.get()

    print('res1 : {0}'.format(res1))

    print('res2 : {0}'.format(res2))

1.3 pool

1)作用:将任务放入进程池,不用自己去调度cpu

例1.3

import multiprocessing

def func1(a):

    return a*a

if __name__ == '__main__':

    pool = multiprocessing.Pool() # 默认会调度所有的CPU

    # pool = multiprocessing.Pool(processes=4) # 还可以指定调度4个(或其他个数)CPU

    # 方式一:map----可以一次传入多个参数

    results = pool.map(func1, range(10)) # 第一个参数:要调度的函数;第二个参数:输入参数的取值范围-----最终pool自己会去调度cpu来计算范围内所有输入值的计算结果

    print(results)

    # 方式二:apply_async----一次只能传入一个参数

    result = pool.apply_async(func1, (2,))

    print(result.get())

    # 那么针对这种方式只能利用for的迭代来完成多个参数的计算

    results = [pool.apply_async(func1, (i,)) for i in range(10)]

    print([result.get() for result in results]) # 效果和方式一一样

1.4 shared memory

例1.4

import multiprocessing

import time,os

def func1(a, shared_value):

    for _ in range(6):

        time.sleep(0.5)

        shared_value.value += a

        print('id : {0}, value : {1}\n'.format(os.getpid(), shared_value.value))

if __name__ == '__main__':

    shared_value = multiprocessing.Value('i', 5)  # 第一个参数:共享值的数据类型;第二个参数:共享值

    p1 = multiprocessing.Process(target=func1, args=(1, shared_value))

    p2 = multiprocessing.Process(target=func1, args=(3, shared_value))

    p1.start()

    p2.start()

    p1.join()

    p2.join()

# 在没有lock时,上述代码就会出现一个抢资源的混乱现象

1.5 lock

1)有了锁后,资源就不会出现混乱

例1.5

import multiprocessing

import time,os

def func1(a, shared_value, lock):

    lock.acquire() # lock

    for _ in range(6):

        time.sleep(0.5)

        shared_value.value += a

        print('id : {0}, value : {1}\n'.format(os.getpid(), shared_value.value))

    lock.release() #释放lock

if __name__ == '__main__':

    lock = multiprocessing.Lock()

    shared_value = multiprocessing.Value('i', 5)  # 第一个参数:共享值的数据类型;第二个参数:共享值

    p1 = multiprocessing.Process(target=func1, args=(1, shared_value, lock))

    p2 = multiprocessing.Process(target=func1, args=(3, shared_value, lock))

    p1.start()

    p2.start()

    p1.join()

    p2.join()

2. 多线程

2

import threading as td

def func1(a, b):

    print('a + b = ', a+b)

if __name__ == '__main__':

    t1 = td.Thread(target=func1, args=(1, 2))  # target:执行的函数名称 agrs:执行的函数传参

    t1.start() # start processing

    t1.join() # wait process finished

你可能感兴趣的:(python,python)