python第二十一次课 2018.05.19

python多进程


进程简介
进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;所有由你启动的进程都是用户进程。进程是操作系统进行资源分配的单位。
在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10毫秒),这样用户根本感觉不出来CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样。但实际上在任何一个时间内有且仅有一个进程占有CPU。


进程和线程
进程(process)和线程(thread)
单个CPU一次只能运行一个任务;在任一时刻,CPU总是运行一个进程,其他进程处于非运行状态;
一个进程可以包含多个线程;
进程没有任何共享状态,进程修改的数据,改动仅限于该进程内;
一个进程的内存空间是共享的,每个线程都可以使用这些共享内存;
一个线程使用某些共享内存时,其他线程必须等它结束才能使用这一块内存;防止多个线程同时读写某一块内存区域,采用互斥锁(Mutual exclusion,缩写Mutex);
某些内存区域只能供给固定数目的线程使用,此时通过信号量(Semaphore)保证多个线程不会互相冲突;
多进程形式,运行多个任务同时运行;多线程形式,允许单个任务分成不同的部分运行;
多线程使用的是cpu的一个核,适合io密集型;
多进程使用的是cpu的多个核,适合运算密集型。




multiprocess
python中的多线程无法利用多核优势,若要充分使用多核CPU资源,在python中大部分情况使用多进程。python提供了非常好用的多进程包multiprocessing。
multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。
multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。




Process类
创建一个Process对象
p = multiprocessing.Process(target=worker_1, args=(2, ))


参数
target:函数名字
args:函数需要的参数,以tuple的形式传入(单个元素的tuple必须有逗号)


方法
p.is_alive() 判断进程p是否存活,是返回True
p.run() 启动进程,它去调用target指定的函数
p.start() 启动进程,它会自动调用run方法,推荐使用start
p.join(timeout) 主线程等待p终止(主线程处于等的状态,p处于运行状态)。p.join只能join使用start开启的进程,不能join使用run开启的进程
p.terminate() 强制进程p退出,不会进行任何清理操作,如果p创建了子进程,该子进程就变成了僵尸进程


属性
p.name 进程的名字
p.pid 进程的pid
p.daemon 默认为False,如果设置为True代表p为后台运行的守护进程,当p的父进程终止时p也随之终止,并且设置为True后,p不能创建自己的新进程,必须在p.start()之前设置
















import multiprocessing


import time




def worker(args, interval):
    print("start worker {0}".format(args))
    time.sleep(interval)
    print("end worker {0}".format(args))


def main():
    print("start main")
    p1 = multiprocessing.Process(target=worker, args=(1, 1))
    p2 = multiprocessing.Process(target=worker, args=(2, 2))
    p3 = multiprocessing.Process(target=worker, args=(3, 3))
    p1.start()
    p2.start()
    p3.start()
    print("end main")


if __name__ == '__main__':
    main()




# p = multiprocessing.Process(target=, args=)
# target   指定的是当进程执行时,需要执行的函数
# args     是当进程执行时,需要给函数传入的参数
# 注意: args必须是一个tuple, 特别是当函数需要传入一个参数时 (1,)
# p 代表的是一个多进程,
# p.is_alive()     判断进程是否存活
# p.run()          启动进程
# p.start()        启动进程,他会自动调用run方法,推荐使用start
# p.join(timeout)  等待子进程结束或者到超时时间
# p.terminate()    强制子进程退出
# p.name           进程的名字
# p.pid            进程的pid








import multiprocessing


import time




def worker(args, interval):
    print("start worker {0}".format(args))
    time.sleep(interval)
    print("end worker {0}".format(args))


def main():
    print("start main")
    p1 = multiprocessing.Process(target=worker, args=(1, 1))
    p2 = multiprocessing.Process(target=worker, args=(2, 2))
    p3 = multiprocessing.Process(target=worker, args=(3, 3))
    p1.start()
    p1.join(timeout=0.5)
    p2.start()
    p3.start()
    print("the number of CPU is: {0}".format(multiprocessing.cpu_count()))
    for p in multiprocessing.active_children():
       print("The name of active children is: {0}, pid is: {1} is alive".format(p.name, p.pid))
    print("end main")


if __name__ == '__main__':
    main()






import time


import multiprocessing




def add1(lock, value, number):
    with lock:
        print("start add1 number= {0}".format(number))
        for i in range(1, 5):
            number += value
            time.sleep(0.3)
            print("number = {0}".format(number))


def add3(lock, value, number):
    lock.acquire()
    print("start add3 number= {0}".format(number))
    try:
        for i in range(1, 5):
            number += value
            time.sleep(0.3)
            print("number = {0}".format(number))
    except Exception as e:
        raise e
    finally:
        lock.release()
        pass


if __name__ == '__main__':
    print("start main")
    number = 0
    lock = multiprocessing.Lock()
    p1 = multiprocessing.Process(target=add1, args=(lock, 1, number))
    p3 = multiprocessing.Process(target=add3, args=(lock, 3, number))
    p1.start()
    p3.start()
    print("end main")
    
    
    
import time


import multiprocessing


from multiprocessing import Value, Array, Manager




def add1(value, number):
    print("start add1 number= {0}".format(number.value))
    for i in range(1, 5):
        number.value += value
        print("number = {0}".format(number.value))


def add3(value, number):
    print("start add3 number= {0}".format(number.value))
    try:
        for i in range(1, 5):
            number.value += value
            print("number = {0}".format(number.value))
    except Exception as e:
        raise e


if __name__ == '__main__':
    print("start main")
    number = Value('d', 0)
    p1 = multiprocessing.Process(target=add1, args=(1, number))
    p3 = multiprocessing.Process(target=add3, args=(3, number))
    p1.start()
    p3.start()
    print("end main")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值