Python基础

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

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

多任务

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

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

从电脑的世界来理解, 就是我一边上网找代码, 一边听着歌, 一边还聊着微信 (都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 的基本应用及流程 多个任务 -> 多个进程 -> 启动进程

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

原文地址:https://www.cnblogs.com/chenjieyouge/p/12374898.html