开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情 并发编程/多任务编程
多任务可以调高CPU的资源,提高程序的执行效率
多任务就是再同一时刻内执行多个任务 。
并发:再同一段时间内交替的执行任务。
并行:对于多核cpu处理多个任务 , 多个内核时真正一起执行软件 , 始终是多个软件一起执行的。(是真正意义上的一起执行)
操作系统的调度:1、先来先服务调度 , 2、短任务调度,3、时间片轮转
进程
一个正在运行的程序/软件就是一个进程
进程是操作系统分配资源的基本单位
进程的创建
python自带的multiprocessing模块是用来创建子进程的
from multiprocessing import Process
import time
def text():
print('我是子进程')
time.sleep(1)
print('我在跳舞 , 唱歌')
time.sleep(2)
print('结束')
if __name__ == '__main__':
print('我是主进程')
# 创建进程对象
'''
Process(
target :执行进程任务名称
args/kwargs : 任务参数
)
'''
s = time.time()
p = Process(target=text)
# 启动子进程
p.start()
print(time.time() - s)
print('父进程结束')
在创建进程的文件中要写上if __name__ == '__main__':
为了防止程序不断的递归创建子进程,导致资源损耗
# 带参数子进程
from multiprocessing import Process
import time
def text(name):
print('我是子进程')
time.sleep(1)
print(f'我是{name}:在跳舞 , 唱歌')
time.sleep(2)
print('结束')
if __name__ == '__main__':
print('我是主进程')
# 创建进程对象
'''
Process(
target :执行进程任务名称
args/kwargs : 任务参数
)
'''
p = Process(target=text , args=('哈巴罗',))
p2 = Process(target=text , kwargs={'name':'二哈'})
# 启动子进程
p.start()
p2.start()
获取进程编号
用来验证子进程与主进程之间是否有关系
os.getpid() # 获取当前进程编号
os.getppid() # 在子进程中获取主进程编号
创建多进程
from multiprocessing import Process
def eat(num):
print(f'这是阿宸吃的第{num}碗面')
if __name__ == '__main__':
print('主进程开始')
for i in range(10):
p = Process(target=eat , args=(i,))
p.start()
# 等待子进程结束之后在结束主进程
p.join()
'''
这样写会出现一个阻塞的情况 , 按照顺序启动执行进程
此时有些进程运行时间比较长 , 需要等待,就会出现一个阻塞的情况
'''
print('主进程结束')
进程之间的数据
不同进程之间的数据是相互隔离的 , 子进程操作主进程的数据,主进程也不会产生影响
from multiprocessing import Process
age = 10
def func(name):
global age
age += 12
print('我是子进程')
print(f'我是{name} , 今年{age}')
if __name__ == '__main__':
p = Process(target=func , args=('帅气的阿宸',))
p.start()
p.join()
print(f'这是主进程的age:{age}')