zoukankan      html  css  js  c++  java
  • 《Python核心编程》 18.多线程编程(一)

    一进程和线程

    1参考链接:

    http://www.zhihu.com/question/25532384OF小工zhonyong 的回答

    总结他们两的回答:

    引言:

    1.电脑的运行,在硬件上是CPU、相关寄存器、RAM之间的事情。负责处理任务的顺序有CPU决定。

    2.程序的上下文:当CPU处理任务时,所需要的各种资源(显卡、寄存器等)准备完毕,构成了这个程序的执行环境,即上下文。

    3.CPU处理任务顺序:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文。

    总结:

    进程:包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文

    线程:CPU执行程序时所划分的各个‘迷你进程’,共享上下文环境。

     

    2本书描述

    进程(重量级进程):是程序的一次执行。

    每个进程都有自己的地址空间、内存、数据栈及其他记录其运行轨迹的辅助数据。操作系统管理(这里应该是是指CPU)在其上运行的所有进程,并为这些进程公平的分配时间。

    各个进程都有自己的内存空间、数据栈等,所以只能使用进程间通讯(iterprocess communication,IPC),而不能直接共享信息。

     

    线程(轻量级进程):类似于进程,不同的是,所有的线程运行在同一个进程中,共享相同的运行环境(同一片数据空间)。故这种并行和数据共享机制是多任务合作变为可能。

    线程分为开始、顺序执行和结束三部分。有自己的指令指针,记录自己运行到什么地方。

    线程的运行可能被抢占(中断),或暂时挂起(也叫作睡眠),让其他的线程运行,这叫做让步。

    在单CPU系统中,不可能真正并行运行多线程。每个线程被安排成每次只运行一小会,然后把CPU让出来,让其他线程去运行。

    在进程的整个运行过程中,每个线程都只做自己的事,在需要的时候跟其他的线程共享运行的结果。

    二 Python、全局解锁器器(GIL)

    在Python中,代码由Python虚拟机(也叫解释器主循环)来控制。

    Python解释器中,可以存放多个线程,但任意时刻,只有一个线程在运行。

    Python解释器由全局解释器锁(global interpreter lock,GIL)来控制。在多线程环境中,Python解释器按以下方式执行:

    1.设置GIL

    2.切换到一个线程中去运行

    3.运行:

         a.指定数量的字节码的指令,或

         b.线程主动让出控制(调用time.sleep(n))

    4.把线程设置为睡眠状态。

    5.解锁GIL。

    6.重复以上步骤。

    三Python中关于线程模块的介绍

    thread模块:提供了基本的线程和锁的支持。(OF小工的回答中有关于锁的形象介绍)

    threading模块:提供了更高级别、功能更强的的线程管理功能。

    Queue(队列)模块:运行用户创建一个可以用于多个线程之间共享数据的队列数据结构。

    三不推荐使用thread模块原因

    1.thread模块中的属性可能会与threading出现冲突。

    2.thread模块的同步原语(关于线程的函数?)很少。

    3.对进程结束时间没有控制(要使用锁)。

    4.不支持守护线程

  • 相关阅读:
    vue组件详解(四)——使用slot分发内容
    vue组件详解(三)——组件通信
    vue组件详解(二)——使用props传递数据
    vue组件详解(一)——组件与复用
    vue表单详解——小白速会
    vue class与style 绑定详解——小白速会
    vue内置指令详解——小白速会
    vue计算属性详解——小白速会
    SQL查询当天、本周、本月记录详解
    SQL Server中使用convert进行日期转换
  • 原文地址:https://www.cnblogs.com/twtp/p/5485483.html
Copyright © 2011-2022 走看看