多线程和并发编程(一)

目录

多任务

进程

进程创建

常用方法

Process属性

创建多个任务

多任务

多任务: 简单的说,就是操作系统可以同时进行多个任务。 多校CPU已经非常昔及了,但是,即使过去的单核CPU.也可以教行多任务,由于CPU执行代码都是顺序执行的。 

操作系统轮流让各个任务交替执行,任务1执行.0秒,切换到任务2. 任务2执行0.01秒,再切换到任务3,执行0.01 ...这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。 

真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。 

进程

程序编写完没有运行称之为程序。正在运行的代码就是进程。在Python3语言中,对多进程支持的是mul tiprocessing模块和subprocess模块。multiprocessing 模块为在子进程中运行任务、通讯和共享数据,以及执行各种形式的同步提供支持。 

进程创建

Python提供了非常好用的多进程包multiprocessing,只需要定义-一个函数,Python 会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multprocessing支持子进程、通信和共享数据。语法格式如下: 

Process([group[,target[,name[,args[,kwargs]]]]])

创建子进程代码: 

# 导入模块
from multiprocessing import Process
def run_test():
    print("...test...")
if __name__=="__main__":
    print("主进程执行")
    # 创建子进程  target接收执行的任务
    p=Process(target=run_test)
    # 调用子进程
    p.start()

其中target表示调用对象,args表示调用对象的位置参数元组。kwargs表示调用对象的字典。name为别名。group参数未使用,值始终为None  

创建子进程并进行传参代码: 

# 导入模块
from multiprocessing import Process
from time import sleep
# 定义任务函数
def ren_test(name,age,**kwargs):
    print("子进程正在进行 name的值:%s,age的值: %d"%(name,age))
    print("字典kwargs:",kwargs)

if __name__=="__main__":
    print("主进程开始执行")
    # 创建子进程
    p=Process(target=ren_test,args=("小明",19),kwargs={"key":12})
    # 调用子进程
    p.start()

常用方法

方法描述
is_alive()如果子进程仍然运行,返回True
join()等待子进程终止。Timeout是可选的潮时,进程可以被链接无数次,但如果连接自身则会出错
run()启动时运行的方法。默认情况下,会调用传递给Process构造函数的target定义进程的另一种方法是继承Process类并重新实现run()函数
start()启动进程,这将运行代表进程的子进程,并调用该子进程中的run()函数
terminate()强制终止进程。如果调用此函数,子进程将被立即终止;同时不会进行任何清理动作。如果子进程创建了它自己的子进程,这些进程将变为僵尸进程。使用此方法时需要特别小心。如果子进程保存了一个锁或参与了进程间通信,那么终止它可能会导致死锁或I/0损坏

join使用方法:  

# 导入模块
from multiprocessing import Process
from time import sleep
def worker(interval):
    print("work  start")
    sleep(interval)
    print("work  end")

if __name__=="__main__":
    print("主进程正在进行")
    # 创建子进程
    p=Process(target=worker,args=(3,))
    p.start()
    # 希望主进程可以在子进程结束之后在结束
    p.join()
    print("主进程执行结束")

join方法中timeout的使用方法: 

# 导入模块
from multiprocessing import Process
from time import sleep
def worker(interval):
    print("work  start")
    sleep(interval)
    print("work  end")

if __name__=="__main__":
    print("主进程正在进行")
    # 创建子进程
    p=Process(target=worker,args=(1,))
    p.start()
    # timeout:等待子进程timeout秒,若timeout之后,子进程仍未结束,主进程将直接结束
    p.join(3)
    print("主进程执行结束")

Process属性

方法描述
name进程的名字
pid进程的整数进程ID

Process的两个属性的使用:  

# 导入模块
from multiprocessing import Process
from time import sleep
def worker(interval):
    print("work  start")
    sleep(interval)
    print("work  end")

if __name__=="__main__":
    print("主进程正在进行")
    # 创建子进程
    p=Process(target=worker,args=(1,))
    p.start()
    # timeout:等待子进程timeout秒,若timeout之后,子进程仍未结束,主进程将直接结束
    p.join(3)
    print("主进程执行结束")

创建多个任务

创建多任务:  

# 导入模块
from multiprocessing import Process
from time import sleep
def work01(interval):
    print("执行work01")
    sleep(interval)
    print("end work01")

def work02(interval):
    print("执行work02")
    sleep(interval)
    print("end work02")

def work03(interval):
    print("执行work03")
    sleep(interval)
    print("end work03")

if __name__=="__main__":
    print("主进程开始执行")
    # 创建子进程
    p1=Process(target=work01,args=(4,))
    p2=Process(target=work02,args=(2,))
    p3=Process(target=work03,args=(3,))
    # 调用子进程
    p1.start()
    p2.start()
    p3.start()
    p1.join()
    p2.join()
    p3.join()
    print("p1.name:",p1.name)
    print("p2.name:",p2.name)
    print("p3.name:",p3.name)
    print("主进程执行完毕")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

And ν

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值