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

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

多任务

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

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

从电脑的世界来理解, 就是我一边上网找代码, 一边听着歌, 一边还聊着微信 (都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. NFS使用TrueNAS SCALE的好处

    之前一直习惯于使用linux自带的NFS服务,但由于NFS空间占用较大自身不带压缩能力,最近使用了号称比较流行的 TrueNAS SCALE 版本,重要的是它还可以提供块服务 Block (iSCSI ...

  2. Qt Json序列化与反序列化

    Qt Json序列化与反序列化 Qt的一个用于序列化与反序列化的库 xpack,也可用于c++. 使用方法 下载库文件 xpack 标签 - Gitee.com 按照它的默认样子放好,建议单独放一个文 ...

  3. 小米9刷twrp Rec 以及写入Magisk详细教程

    首先手机必须先解锁BL锁才能继续: ---------------------- 小米官方BL解锁教程:点此看教程 ---------------------- 解完锁后开始操作: 工具包:点此下载 ...

  4. PowerShell开发游戏 · 打蜜蜂

         可以看到,虽然非常抽象简单,但是基础游戏框架已经搭建,游戏机制完善,就缺美工了,哈哈~~~~ [首先] Powershell不是用来开发游戏的,但是没人规定不能开发.因为它可以调取windo ...

  5. Flink学习(三) 批流版本的wordcount Scala版本

    批处理代码: package com.wyh.wc import org.apache.flink.api.scala._ /** * 批处理代码 */ object WordCount { def ...

  6. C# 图形界面编程之 FlowLayoutPanel 界面闪烁问题解决

    公司需要我写几个GUI程序,让虚拟机(guest)内部可以控制虚拟机(host)外部的硬件. 控制外部的硬件的方法就是开一个串口,这样虚拟机与宿主机就可以相互通讯,此时就可以让虚拟机发送命令,宿主机执 ...

  7. 基于 Trae Claude-3.7 从0到1 打造加密货币钱包Dompet-App

    从0到1:用Trae Claude-3.7打造加密货币钱包Dompet-App 项目介绍 大家好!今天我要分享如何使用强大的AI助手Trae Claude-3.7,从零开始构建一款功能丰富的加密货币钱 ...

  8. 【Matlab】输出变量内容到xls文件

    版本: matlab 2017a 功能:将矩阵输出一个excel文件 代码: function [ statu ] = write2xls( x,filename,sheet) % 返回值: % 1 ...

  9. TPC-H 研究和优化尝试

    TPC-H测试提供了8张表,最近做这个测试,记录下过程中的关键点备忘. 1.整体理解TPC-H 8张表 2.建立主外键约束后测试22条SQL 3.分区表改造,确认分区字段 4.重新测试22条SQL 5 ...

  10. windows linux子系统(Ubuntu)ip地址

    在Windows10安装好了的子系统(Ubuntu)上,安装了nginx 想去访问,使用ipconfig .ip add,查询来的ip地址都跟自己Windows10的ip完全一样,难道Linux子系统 ...