进程

65 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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}')