估计很多小伙伴会认为, 类似, 进程, 线程, 协程等这些, 比较专业的词汇, 应该是比较高深的内容, 作为入门基础不太合适. 而, 事实确实如此. 但, 如果不是做研究的, 仅从功能的视角看看待, 会发现, 多任务 从生活的视角去切入, 是非常直观的.

我现在应该可以回答这个问题: 写代码的本质是在做什么? 我认为就是对现实世界的抽象和模拟. 比如这里的多任务

多任务

多任务, 从我日常生活举例, 即我每天下班后, 首先是打开电脑放点音乐, 然后煮饭的同时, 煮菜...

这就是多任务呀, 同一个时间内,做着多件事情. 合理利用有限资源呀, 嗯, 经济, 管理的小伙伴对此应该特有感触, 对"经济" 的理解, 直观上, 就是 "如何省钱"(最优化目标) 而已, 而管理则通过 计划, 组织, 控制, 领导, 创新 等角度去达到 "经济的目标" (约束条件, 资源) , 即要合理利用资源, 不能闲着, 合理安排, 一人同时干几个人的活, 这是能通过管理实现的. 这就是多任务呀.

从电脑的世界来理解, 就是我一边上网找代码, 一边听着歌, 一边还聊着微信 (都PC端完成哈). 从操作系统的视角, 它让多个任务, 交替执行,不断地进行切换, 切换... 速度是及其快的. 于是我们就会真的以为, 我电脑的微信和浏览器, 是一直在同时运行着的. 很多任务要执行, 而CPU的核心数是有限的. 而操作系统则会将多个任务轮流调度到各个核心去执行, 这就是通俗理解, 任务调度.

多任务的执行, 我们理论是希望能 "真正" 实现多任务同时运行, 就任务数量 <= 核心数, 那这时候, 厉害了, 也称为 并行任务, 这现实中几乎不大可能哦. 而更多的是, 很多任务下, 操作系统通过一些调度的算法来不断切换任务的运行, 而让我们感觉它们是一起在工作, 这种最常见的情景, 也就是 并发.

多进程

进程是操作系统资源分配的基本单元, 理解为, 电脑上运行着的多个程序即可, 有时候某个程序卡顿了, 关也关不掉, win 下, 大家都是尝试 按快捷键 ctr + alt + delete 然后到任务管理去, 关闭掉任务, 这就是相当于 kill 掉该程序的进程了呀.

谈到程序卡顿, 我顿时又想吐槽一下.

之前有小伙伴, 用Excel, 然后数据量比较大一点, 就会经常卡顿, 然后就总是认为, 是电脑太卡...

可见, 这个卡顿的锅, 这个 Excel 是有一点, 甩的漂亮呀.

直接进入正题, 看看 Python 的一些写好的多任务工具是如何来弄的, 我还是一样的观点, 先应用, 在探索.

顺序执行

import time

def task_01():
for _ in range(2):
print("task_01 is working...")
time.sleep(0.1) def task_02():
for _ in range(2):
print("task_02 is working...")
time.sleep(0.1) if __name__ == '__main__':
task_01()
task_02()
task_01 is working...
task_01 is working...
task_02 is working...
task_02 is working...

就是按任务的先后顺序, 先执行完一个, 然后再执行另一个呀, 这没啥可说的.

进程交替执行

就不断来回切换执行呀, 这里用一个内置的库, multiprocessing, 一个任务弄一个进程来跑, 试一波.

import time
import multiprocessing # 1. 创建多个任务
def task_01():
for _ in range(2):
print("task_01 is working...")
time.sleep(0.1) def task_02():
for _ in range(2):
print("task_02 is working...")
time.sleep(0.2) if __name__ == '__main__': # 2. 为每个任务创建进程, 这里有2个任务, 创2个进程来跑
p1 = multiprocessing.Process(target=task_01)
p2 = multiprocessing.Process(target=task_02) # 3. 启动进程
p1.start()
p2.start()
task_01 is working...
task_02 is working...
task_01 is working...
task_02 is working...

可以看到, 任务是不断交替运行的. 根据切换时间不同的哈, 这里是为了方便演示而已.

参数传递 args, kwargs

import time
import multiprocessing # 1. 创建多个任务
def task_01(n):
for _ in range(n):
print("task_01 is working...")
time.sleep(0.1) def task_02(n):
for _ in range(n):
print("task_02 is working...")
time.sleep(0.2) if __name__ == '__main__': # 参数传递: args, 以元组的方式; kwargs, 以字典方式
p1 = multiprocessing.Process(target=task_01, args=(4,)) p2 = multiprocessing.Process(target=task_02, kwargs={'n':3}) # 3. 启动进程
p1.start()
p2.start()
task_01 is working...
task_02 is working...
task_01 is working...
task_01 is working...
task_02 is working...
task_01 is working...
task_02 is working...

当然还是还多的参数可以传, 具体看需求, 查看下代码就明白了.

不共享全局变量

import time
import multiprocessing lst = [] def get_data():
print('all_data:', lst) def add_data(n):
for i in range(n):
lst.append(i)
print('add_a new_data:', i) if __name__ == '__main__':
p1 = multiprocessing.Process(target=get_data)
p2 = multiprocessing.Process(target=add_data, kwargs={'n': 3}) # 3. 启动进程
p1.start()
p2.start()
all_data: []
add_a new_data: 0
add_a new_data: 1
add_a new_data: 2

这是一个很大问题, 多进程之间是不能共享数据的哦. 该如何解决这个问题呢. 后面再来解决, 先到这吧.

小结

  • 对多任务有个初始, 即同多个任务同时跑, 当然cpu其实是调度的, 但人们是察觉不出来的.
  • 进程是就是一个个运行的程序, 操作系统资源分配的基本单元.
  • 多任务模块 multiprocessing 的基本应用及流程 多个任务 -> 多个进程 -> 启动进程

理解这种概念是最为重要的, 然后运用中, 会百度就行... 上篇留了个问题, 关于, 多进程间不能共享变量如何解决, 还还有, 关于守护进程, 异步任务等概念理解, 下篇再弄, 我也得去嫖点知识消化一波.

Python基础 - 多进程(上)的更多相关文章

  1. 从零开始学Python第一周:Python基础(上)

    Python语法基础(上) 一,Python的变量 (1)创建变量 变量的含义:存储信息的地方 创建变量并赋值 x = 1 print x x = 123 #再次赋值 print x (2)使用变量 ...

  2. Python基础(上)

    前言 正式开始Python之旅,主要学习内容专注在爬虫和人工智能领域,如Web开发之类将跳过不研究. Python的意思是蟒蛇,源于作者Guido van Rossum(龟叔)喜欢的一部电视剧.所以现 ...

  3. 吾八哥学Python(三):了解Python基础语法(上)

    学习一门开发语言首先当然是要熟悉它的语法了,Python的语法还算是比较简单的,这里从基础的开始了解一下. 标识符1.第一个字符必须是字母表中字母或下划线'_'.2.标识符的其他的部分有字母.数字和下 ...

  4. python基础15上_迭代器_生成器

    # 迭代器和生成器 # 迭代器: # 双下方法 : 很少直接调用的方法.一般情况下,是通过其他语法触发的 # 可迭代的 —— 可迭代协议 含有__iter__的方法('__iter__' in dir ...

  5. Python基础Day1—上

    一.计算机基础 CPU:中央处理器,相当于人的大脑:运算中心与控制中心的结合. 内存:临时存储数据,与CPU交互. 硬盘:永久存储数据. 内存的优点:读取速度快 内存的缺点:容量小,造价高,断电数据会 ...

  6. python基础===多进程

    进程线程的区别在进程,线程,协程的区别 linux或者unix有fork()函数,但是不支持win系统. multiprocessing multiprocessing模块是跨平台版本的多进程模块.支 ...

  7. 测验2: Python基础语法(上) (第4周)

    快乐的数字 描述 编写一个算法来确定一个数字是否“快乐”. 快乐的数字按照如下方式确定:从一个正整数开始,用其每位数的平方之和取代该数,并重复这个过程,直到最后数字要么收敛等于1且一直等于1,要么将无 ...

  8. Python基础知识(Basic knowledge)

    Python基础知识(Basic knowledge) 1.认识Python&基础环境搭建 2.Python基础(上) 3.Python基础(中) 4.Python基础(下) 5.Python ...

  9. Python基础(2) - 动态数据类型

    Python是一门强类型语言,单定义变量时不需要制定类型. C#这样定义变量: ; VB这样定义变量: Python不需要制定类型,给变量赋什么类型的值,它就是什么类型.(穿神马就是神马?) > ...

  10. Python基础教程2上的一处打印缺陷导致的代码不完整#1

    #1对代码的完善的 出现打印代码处缺陷截图: 图片上可以看到,定义的request根本没有定义它就有了.这个是未定义的,会报错的,这本书印刷问题,这个就是个坑,我也是才发现.花了点时间脱坑. 现在发完 ...

随机推荐

  1. SHA1字符串加密

    使用SHA1算法,生成某个字符串的hash值作为该字符串所代表对象的唯一标识: Demo: using System; using System.Collections.Generic; using ...

  2. 安川YASKAWA机器人主板维修方法合集

    安川机械手板卡故障分析与YASKAWA机械臂主板维修步骤 1. 确认故障现象:首先,我们需要详细了解安川机器人主板故障现象,包括但不限于工作异常.运行错误.速度变慢等. 2. 拆卸主板:根据故障现象, ...

  3. 库卡机器人KR240电源模块维修思路讲解

    一.库卡机器人KR240电源模块故障诊断 故障诊断是维修过程中的关键步骤.使用库卡提供的诊断工具或软件,对库卡机器人KR240电源模块进行故障诊断.重点关注电源供应.输出电压.电流等关键参数.通过诊断 ...

  4. 甲壳虫ADB助手-让你轻松不用电脑就能卸载电视自带软件

    甲壳虫ADB助手是一款非常使用的安卓ADB调试工具,它适用于各种安卓系统设备,包括手机.平板.手表和电视等等,可以帮助用户直接在手机上对设备进行ADB调试,而且不需要ROOT,支持无线配对连接,让用户 ...

  5. Vue + Element 实现按钮指定间隔时间点击

    1.业务需求 需要加一个按钮,调用第三方API,按钮十分钟之内只能点击一次,刷新页面也只能点击一次 2.思路 加一个本地缓存的时间戳,通过时间戳计算指定时间内不能点击按钮 3.实现 1)vue页面 & ...

  6. iview weapp输入组件input事件顺序

    做小程序,使用ivew weapp组件框架,同时用到了i-input和i-modal,更具体说,就是在modal里面放置了input,填写数据后点击确定,实现提交数据. 出现点小问题,发现是事件顺序导 ...

  7. AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现

    引言 在当今这个数据爆炸的时代,信息的快速存储与高效检索已经成为技术领域的核心挑战.随着人工智能(AI)和机器学习(ML)的迅猛发展,向量存储和相似性搜索技术逐渐崭露头角,成为处理海量数据的利器.对于 ...

  8. Win10下子系统Unbuntu18.04安装nginx

    1.Nginx的软件包在Ubuntu默认软件仓库中可用. 安装非常简单,只需键入以下命令: sudo apt update sudo apt install nginx 2.安装完成后,检查Nginx ...

  9. 解决ERROR 1231 (42000): Variable 'time_zone' can't

    MySQL根据配置文件会限制Server接受的数据包大小.有时候大的插入和更新会受 max_allowed_packet 参数限制,导致写入或者更新失败.(比方说导入数据库,数据表) mysql 数据 ...

  10. selenium自动化测试-获取黄金实时价格

    最近黄金比较火爆,想要获取黄金实时价格,方便后续监控预警价格,一般实时刷新的网页数据都是动态加载的,需要用到selenium自动化测试获取动态页面数据. 昨天学会了获取动态网页小说内容,同理也可以获取 ...