设为首页 加入收藏

TOP

同步与异步 multiprocessing 进程对象多种方法(一)
2023-07-25 21:24:58 】 浏览:108
Tags:步与异 multiprocessing 程对象 方法

同步与异步

用来表达任务的提交方式

同步:
提交完任务之后原地等待任务的返回结果 期间不做任何事
异步:
提交完任务之后不愿地等待任务的返回结果 直接去做其他事 有结果自动通知

阻塞与非阻塞

用来表达任务的执行状态

阻塞
程序处于阻塞态
非阻塞
程序处于就绪态、运行态

综合使用

  1. 同步阻塞
    提交任务之后 cpu走了 进程不执行了
  2. 同步非阻塞
    在原地做一些事情
  3. 异步阻塞
    cpu没来做不了事情
  4. 异步非阻塞(效率最高)
    提交完任务之后 进程还继续 cpu也还在

异步非阻塞框架(写游戏、响应速度、效率高)

创建进程的多种方式

前言

# 1.创建进程的步骤
如何创建进程?用鼠标双击一个桌面图标,就创建了一个应用程序的进程。
而我们可以用python代码创建进程,这其中至少有这样的过程:
1.硬盘中存放python代码
2.读取代码到内存
3.cpu执行代码
4.操作系统创建新进程

# 2.不同操作系统的差异(重要)
因为进程是由操作系统创建的,所以根据不同操作系统也会有差异:
"""
在不同的操作系统中创建进程底层原理不一样
    windows
        以导入模块的形式创建进程(需要使用if __name__ == 'main')
    linux/mac
        以拷贝代码的形式创建进程 (复制的时候不包含创建进程的代码)
"""

# 3.父进程和子进程
比如一个浏览器,可能会有很多分页。那相对的来说浏览器就是主进程,一个页面就是一个子进程。
一个py文件,里面写了创建进程的代码。那这个py文件运行之后,首先他自己是一个进程(父进程),被他创建出来的进程是他的子进程。
父进程和子进程是相对的概念,比如刚刚所说的py文件,又是pycharm的子进程。

windows系统创建进程的问题(重要)

在windows系统下使用Python模块multiprocessing模块创建进程:

from multiprocessing import Process
import time

def task():
    print('子进程开始执行')
    time.sleep(3)
    print('子进程执行结束')

p = Process(target=task)  # 使用Process模块创建一个子进程 在子进程运行task函数
p.start()  # 运行子进程

print('主进程运行结束')

# 执行后会产生如下报错信息:
'''
RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.

Process finished with exit code 0
'''

为什么会产生这样的报错呢?
windows以导入模块的形式创建进程。
image
所以产生报错的就是如下两行代码:
image
解决:

from multiprocessing import Process
import time


def task():
    print('子进程开始执行')
    time.sleep(3)
    print('子进程执行结束')


if __name__ == '__main__':
    p = Process(target=task)
    p.start()
'''
将这两行代码放入if __name__ == 'main':
使主进程作为模块导入的时候,不再执行这两行代码,就不会出现问题了。
'''

multiprocessing模块之Process

展现异步

展现异步之前,先举一个同步的例子:

import time

def task():
    print('子进程开始执行')
    time.sleep(3)
    print('子进程执行结束')

if __name__ == '__main__':
    task()   # 程序会跳回去执行task函数,task没执行完就不会执行下面的print()
    print('主进程运行结束')

'''输出结果:
子进程开始执行
子进程执行结束
主进程运行结束
'''

展现异步:

def task():
    print('子进程开始执行')
    time.sleep(3)
    print('子进程执行结束')


if __name__ == '__main__':
    p = Process(target=task)
    p.start()
    print('主进程运行结束') # 这行代码执行最快 主进程真的结束了吗? =。=

'''输出结果:
主进程运行结束
子进程开始执行
子进程执行结束
'''

为什么是这样的输出结果?
p.start()执行完后,相当于向操作系统发送了一个信息,要创建一个子进程。操作系统要处理信息是需要一定时间的。主进程只是发了一个信息就完了,代码继续往下走,自然会执行print。等操作系统反应过来了,子进程才会开始执行,而这个速度是慢于主进程代码执行速度的。也就是说: 操作系统开辟内存空间的时候 主进程不停着,直接运行下一行。
请解释输出结果:
image
请解释输出结果:
image

创建进程的方式(一):使用Process()创建进程对象

基本使用

import time
from multiprocessing import Process

def task():
    print('子进程开始执行')
    time.sleep(3)
    print('子进程执行结束')


if __name__ == '__main__':
    p = Process(target=task)
    print(p, type(p))  # <Process(Process-1, initial)> <
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python工具箱系列(十四) 下一篇python中的for循环

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目