" name="sm-site-verification"/>
侧边栏壁纸
博主头像
PySuper博主等级

千里之行,始于足下

  • 累计撰写 203 篇文章
  • 累计创建 14 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Python处理多任务 -- 进程、线程、协程对比(四)

PySuper
2019-12-09 / 0 评论 / 0 点赞 / 12 阅读 / 2523 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

进程、线程、协程

关系

  • 一个进程至少有一个线程, 进程里面可以有多个线程
  • 一个线程里面可以有多个协程
  • 进程 == > 线程 == > 协程

多任务

对比

  • 协程切换任务资源很小,效率高
  • 多线程,多进程,根据CPU核数不一样,可能是并行的
  • 但是协程是在一个线程中,所以是并发
  • 开辟协程需要的资源最少

多进程 + 多线程

  • 再多进程中使用进程池的方式,根据CPU个数生成多个进程
  • 在单个进程中,再创建多个线程
  • 最后把真正计算的代码放到单线程执行的Function中
"""多进程 + 多线程"""
import os
import threading
from multiprocessing import Pool, cpu_count


def thread_func(num):
    """
    线程中执行的Function
    """
    print({"Num": num, "Pid": os.getpid(), "Thread": threading.currentThread()})


def process_func(num):
    """
    调用多个线程,执行线程中的Function
    """
    for i in range(2):  # 设置单个进程中 线程的个数
        # 创建并启动当前线程
        threading.Thread(target=thread_func, args=(num,)).start()


if __name__ == '__main__':
    pool = Pool(cpu_count())  # 适应CPU个数的进程池 ==> 进程数在这里写过了
    for num in range(4):  # range里面的值只是 需要处理的数据量
        # 执行当前进程中的Function
        pool.apply_async(process_func, args=(num,))
    pool.close()
    pool.join()

使用协程最简单的方法,就是在一个Function中使用yield返回,这样就能一边返回当前函数中的数据,一边在接受函数输出时候还可以直接调用

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区