专栏首页python3经验拾忆(纯手工)=> Python三

经验拾忆(纯手工)=> Python三

GIL的理解

GIL这个话题至今也是个争议较多的,对于不用应用场景对线程的需求也就不同,说下我听过的优点: 1. 我没有用过其他语言的多线程,所以无法比较什么,但是对于I/O而言,Python的线程还是比较高效的。 2. 有些第三方基于Python的框架和库,比如Tensorflow等基于C/C plus plus重写的Python线程机制。 3. 至于换成Cython编译器解决GIL,这个只是听过,没用过。 4. Python多线程对于web、爬虫方面也可以表现出较好的性能。 5. Python多进程是完好的,可以把资源消耗较少的非必要线程工作转为多进程来工作。 6. 计算密集型就别想多线程了,一律多进程。 7. Python还有细粒度且高效的协程。 8. 如果有N核CPU,那么同时并行的进程数就是N,每个进程里面只有一个线程能抢到工作权限。 所以同一时刻最大的并行线程数=进程数=CPU的核数(这条我的个人理解很模糊,参考吧)

多线程

多线程有2种通过start的那种方式,非常普遍,此处就不写了。
新版线程池 future库 是python3.2新出的功能(记住这个future)
方式1:(sublime运行后直接贴上来了)
    from time import sleep
    from concurrent.futures import ThreadPoolExecutor,as_completed,ALL_COMPLETED,wait
    
    executor = ThreadPoolExecutor(max_workers=10)        # 初始化线程池10个坑
    def f():
        sleep(15)
        return 100
    all_tasks = [executor.submit(f) for _ in range(10)]  # 提交10个线程,全放池里执行
    # for per_thread in as_completed(all_tasks):         
        # print(per_thread.result())
    ---------# 注意上面,as_completed(all_tasks) 是等待future对象完成后才执行主线程
    ---------# 注意下面,wait和 as_completed() 的 作用一样,就和普通版的join() 相似
    for per_thread in all_tasks:
        print(per_thread.result())
    wait(all_tasks, return_when=ALL_COMPLETED)   # 还可以选FIRST_COMPLETED,待第一个完成后
    print('主线程')
        
方式2: map多线程版
    value_list = executor.map(func, list(range(10))) # 返回的直接是map后的序列
    for value in value_list:
        print(value)
    注意:    
        这个map方式,如果要传多个参数就涉及到高阶函数那节讲的偏函数了。

多进程

多进程有2种通过start的那种方式+普通进程池,同样非常普遍,此处就不写了,自己百度一下。
新版进程池 同样是和上面用一样的future库,惊不惊喜。(可以看出好的程序要向着统一封装的方向优化)
也许你会惊讶,因为只把thread单词改为processing就是进程池版本了,就是这么简单!!!!!
from time import sleep
import multiprocessing
from concurrent.futures import ProcessPoolExecutor,as_completed,ALL_COMPLETED,wait
executor = ProcessPoolExecutor(max_workers=multiprocessing.cpu_count())
def f():
    sleep(15)
    return 100

if __name__ == '__main__':    # 这句要加
    all_tasks = [executor.submit(f) for _ in range(multiprocessing.cpu_count())]
    for per_thread in as_completed(all_tasks):
        print(per_thread.result())
    # for per_thread in all_tasks:
    #     print(per_thread.result())
    # wait(all_tasks, return_when=ALL_COMPLETED)
    print('主进程')   
# 这就是 futures 模块 设计思想的魅力

多协程

前言: 也许你记得,函数用到 yield 来代替 return 就变成了 生成器。其特点是代码片段断点式执行。 如果有多个yield, 就可以自己用程序来切换执行程序。(这就是协程的特点) 推荐:(学习中。。。) 此笔者写的很好: https://juejin.im/post/5ccf0d18e51d453b557dc340

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaScript实现3秒后页面自动跳

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.or...

    py3study
  • python 线程池threadpool

    最近在做一个视频设备管理的项目,设备包括(摄像机,DVR,NVR等),包括设备信息补全,设备状态推送,设备流地址推送等,如果同时导入的设备数量较多,如果使用单线...

    py3study
  • day24 01 初识继承

    继承:是一种创建新类的方式,新建的类可以继承一个或者多个父类,父类又可称基类或超类,新建的类称为派生类或者子类

    py3study
  • VB.NET 连接oracle数据库

    大家都知道,开发中连接oracle数据库比较麻烦,要什么客户端之类啊!而且要引用一堆类库,今天我们用Oracle.ManagedDataAccess.Clien...

    巴西_prince
  • 公司数据结构+算法面试100题

    1.把二元查找树转变成排序的双向链表(树) 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 ...

    CloudDeveloper
  • 火绒安全周报:雷电接口存漏洞可快速解锁设备 漏洞收购平台因iOS漏洞太多暂停购买

    近日有安全人员发现,IntelThunderbolt接口(雷电接口)存在漏洞Thunderspy,该漏洞允许黑客从锁定和加密的PC中复制内存或者轻松绕过锁屏。

    用户6477171
  • iPhone 11系列/新iPad消息汇总

    iPhone 11系列/新iPad消息汇总: 外观基本不变,大小和刘海基本一致。部分配色会加入哑光效果,并且采用新的防碎玻璃技术,减少跌落时背盖碎裂的可能。

    小贝壳
  • 探索Redis设计与实现3:Redis内部数据结构详解——sds

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖
  • PowerBI DAX 度量值管理 - 基本编写到高级管理

    我们会用几篇文章来描述这些问题如何在当前的 PowerBI 中实现。很多问题的解决并不是能用 PowerBI 内置功能解决,这也算是一个痛点,按照微软的表述,微...

    BI佐罗
  • 【技术分享】三:搜索排序—机器学习化建模

    在搜索排序概述里面说到搜索排序算法的发展的第二个阶段Learning to rank (LTR) 的时候就已经提到了机器学习,还整出了哲学词:审时度势。 在这里...

    腾讯智能钛AI开发者

扫码关注云+社区

领取腾讯云代金券