zoukankan      html  css  js  c++  java
  • Python的多线程threading和多进程multiprocessing

    python中的多线程就是在一个进程中存在着多个线程,在线程中,所有的线程都是共享资源的,线程之间的数据通信很简单。但是python仅支持一个线程的运行,因为python中存在一个全局解释器锁GIL(global interpreter lock),正是这个锁能保证同一时刻只有一个线程在运行,所以多线程依旧像是单线程的运行。

    GIL无疑就是一把对多线程有影响的全局锁,解决它对多线程的影响,不单单是释放GIL这么简单。GIL使得对象模型都是可以并发访问。GIL全局解释器锁解决多线程之间数据完整性和状态同步的问题,但是这个锁在同一时刻只有一个线程在运行,所以在多核的情况下也只能发挥出单核的性能,多线程依旧像是单线程的运行。下面用一个单线程和多线程对比实例给大家看一下结果。

    img

    执行结果:

    total time of single is: 0.04100227355957031

    total time of multi is: 0.019001245498657227

    python多线程编程是为了并行运行相互独立的子任务,大幅度提高整个任务的效率,比如异步任务、运算密集型任务等。线程有开始,顺序执行和结束三个阶段。python多线程编程中常用方法有:start()方法、run()方法、join()方法、isAlive()方法、getName()方法、setName()方法、isDaemon()方法、setDaemon()方法等。

    在python多线程模块主要有thread和threading,推荐大家使用threading模块,因为threading进行了大量的封装,从而不需要管理子线程和主线程之间的问题,也允许用户自己创建和管理线程。

    img

    多任务可以由多进程完成,也可以由一个进程内的多线程完成。多线程中任务有以下特点:异步的,多个并发事务,各个事务的运行顺序是不确定的、随机的、不可预测的。所以多线程编程模型复杂,容易发生冲突,必须用锁加以隔离,同时,又要小心死锁的发生。

    其实python的多线程其实并不是真正的多线程,因为GIL(global interpreter lock)全局解释器锁的存在,导致python中大部分情况需要使用multiprocessing,多进程完成从单进程到并发执行的转换。

    Python的多进程包multiprocessing支持子进程、通信和共享数据、执行不同形式的同步。在multiprocessing中,一个程序的执行实例就是一个进程,每一个进程都用一个Process类来表示,每一个进程提供执行程序所需的所有资源。同一个进程中的线程共享同一内存空间,但是进程之间是独立的。同一个进程中的所有线程的数据是共享的(进程通讯),进程之间的数据是独立的。

    img

  • 相关阅读:
    解決 centos -bash: vim: command not found
    linux环境下安装tomcat6
    由于防火墙限制无法访问linux服务器上的tomcat应用
    linux环境下安装jdk1.6
    JSP输出HTML时产生的大量空格和换行的去除方法
    git使用
    Python+selenium+eclipse+pydev自动化测试环境搭建
    jmeter 打不开 提示“Not able to find Java executable or version”的解决办法
    appium如何解决每次都要安装apk的烦恼
    appium 中手势密码的定位坐标
  • 原文地址:https://www.cnblogs.com/paisenpython/p/10371689.html
Copyright © 2011-2022 走看看