多线程编程

在多线程(multithreaded,MT)出现之前,计算机程序的执行都是由单个步骤序列组成的,该序列组合在主机的CPU中按照同步顺序执行。无论是任务本身需要按照步骤顺序执行,还是整个过程实际上包含了多个子任务,都需要按照既定顺序方式执行。那么,如果这些子任务相互独立,没有因果关系呢,我们是不是考虑要让这些独立的任务同时进行呢?这种并行处理方式可以显著地提高整个任务的性能。这就是多线程编程。

由以上我们可以推测一下,多线程编程针对具有如下特点的编程任务是非常理想的:本质上是异步的;需要多个并发任务;每个活动的处理顺序可能是不确定的。这种编程任务可以被组织成或者划分成多个执行流,其中每个执行流都有一个指定要完成的任务。根据应用的不同,这些子任务可能需要计算出中间结果,然后合并成最终的输出结果。

计算密集型的任务可以比较容易的划分为多个子任务,而那种使用单线程处理多个外部输入源的任务就不那么简单了。如果不使用多线程,要实现这种编程任务就需要为串行程序使用一个或多个计时器,并实现一个多路复用方案。一个串行程序需要从每个IO终端通道来检查用户的输入,然而,程序在读取IO终端通道时不能阻塞,因为用户输入的到达时间是不确定的,并且阻塞回复妨碍其他IO通道的处理。串行程序必须使用非阻塞的IO或拥有计时器的阻塞IO。串行程序只有唯一的执行线程,因此他必须兼顾要执行的多个任务,确保其中的某个任务不会占用过多时间,并对用户的响应时间进行合理的分配。要想实现类似的要求,往往会造成非常复杂的控制流,难以理解和维护。

多线程编程,以及类似Queue(一种多线程队列数据结构)的共享数据机构,可以把任务规划为几个执行特定函数的线程:

  • UserRequestThread:负责读取用户端的输入。程序将创建多个线程,每个客户端一个,客户端的请求将会被放入队列中。
  • RequestProcessor:该线程负责从队列中获取请求并处理,为下一步的线程提供输出。
  • ReplyThread:负责向用户输出,将结果传给用户,或者把数据写到本地文件系统或者数据库中

这个设计中,每个线程的逻辑都不复杂,他们都只需要一个要完成的特定作业。你只需要设计每类线程去做一件事情就可以了。

进程:

计算机程序就是存储在磁盘上的可执行的二进制文件。只有当它们被加载到内存中并被操作系统调用,才拥有生命周期。进程(有时又叫重量级进程)则是一个执行中的程序。每个进程都拥有自己的地址空间、内存、数据栈以及其他一些用于追踪执行的数据。操作系统管理者其上所有进程的执行,并尽量为它们分配时间。进程还可以通过派生新的进程来执行其他任务(不同的操作系统上叫法不同,Linux上交fork)。注意的是,每个新进程也都拥有自己的内存和数据栈等,进程之间是通过进程间通信(IPC)的方式实现信息的共享。

线程:

一般提到线程(又叫轻量级进程)的时候,默认的前提是它们都是在同一个进程下执行的,并享有相同的上下文。可以将其认为是在一个主进程或者‘主线程’中并行运行的一些‘迷你线程’

线程一般包括开始、执行顺序和结束三部分。它有一个指令指针,用于记录当前运行的上下文。当其他线程运行时,它可以被抢占(中断)和临时挂起(睡眠)。这种方式叫让步(yielding)。

同一个进程中的各个线程和主线程共享同一片数据空间,所以,相比于进程而言,线程间的通信和信息共享更能容易实现;线程一般是并发执行的。综合这两点,使得多任务间的协作成为可能。注意的是,单核CPU的前提下,真正的并发是不可能,线程一般都是这么执行的:每个线程执行一段时间,然后让步给其他线程;每个线程都有自己的任务,必要的时候,可以和其他线程进行结果通信。

另外,有共享就有风险。由于多个线程可以访问同一片数据,由于数据访问的顺序不同,可能导致结果不一致的现象。这种情况成为竟太条件(race condition)。解决方法是,大部分语言都有一些同步原语,用于线程管理器控制执行和访问。

还有就是,线程无法给与公平的执行时间。因为有些函数在完成前保持阻塞状态,如果没有专门为多线程情况进行修改,会导致CPU的时间分配像这些贪婪的函数倾斜。

总结:

线程是最小的执行单元,而进程至少由一个线程组成。如何调度进程和线程,由操作系统决定。

多进程和多线程编程,涉及到同步、数据共享的问题,需要多花功夫。

python 多线程编程之进程和线程基础概念的更多相关文章

  1. python并发编程之进程、线程、协程的调度原理(六)

    进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...

  2. Java多线程1:进程与线程的概念、区别和联系

    一.进程的的概念 引用线程之前进程的概念: 进程是表示资源分配的基本单位,也是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括内存空间.磁盘空间.I/O设备等.然 ...

  3. Python学习笔记 - day13 - 进程与线程

    概述 我们都知道windows是支持多任务的操作系统. 什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务.打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多 ...

  4. 关于python多线程编程中join()和setDaemon()的一点儿探究

    关于python多线程编程中join()和setDaemon()的用法,这两天我看网上的资料看得头晕脑涨也没看懂,干脆就做一个实验来看看吧. 首先是编写实验的基础代码,创建一个名为MyThread的  ...

  5. day-3 python多线程编程知识点汇总

    python语言以容易入门,适合应用开发,编程简洁,第三方库多等等诸多优点,并吸引广大编程爱好者.但是也存在一个被熟知的性能瓶颈:python解释器引入GIL锁以后,多CPU场景下,也不再是并行方式运 ...

  6. python(40)- 进程、线程、协程及IO模型

    一.操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式:向下管理硬件,向上提供接口. 操作系统进行进程切换:1.出现IO操作:2.固定时间. 固定时间很短,人感受不到.每一个应用层运行起 ...

  7. python多线程编程

    Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...

  8. Python全栈【进程、线程】

    Python全栈[进程.线程] 本节内容: 进程 线程 协程 I/O多路复用 进程 1.进程就是一个程序在一个数据集上的一次动态执行过程,进程是资源分配的最小单元. 2.进程一般由程序.数据集.进程控 ...

  9. 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)

    数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...

随机推荐

  1. jquery ajax提交数据给后端

    大家好,今天铁柱兄给大家带一段jquery ajax提交数据给后端的教学. 初学javaweb的同学前端提交数据基本上都是用form表单提交,这玩意儿反正我是觉得不太好玩.而JavaScript aj ...

  2. 01 jQuery配置、jQuery语法结构、jQuery对象与DOM对象的互相转换

    配置jQuery环境 下载jQuery    官网:jquery.com 学习或开发建议选择未压缩版,便于学习,发布建议选择压缩版,便于用户极速体验(点击下载若出现的是代码页 面,Ctrl+A全选复制 ...

  3. NIO-概览

    目录 NIO-概览 目录 前言 什么是NIO 通道 缓冲区 选择器 其他 管道 FileLock 参考文档 NIO-概览 目录 NIO-概览 前言 本来是想学习Netty的,但是Netty是一个NIO ...

  4. C语言l博客作业01

    2.1 你对软件工程专业或者计算机科学与技术专业了解是怎样?(2分) 计算机科学与技术是国家一级学科,下设信息安全,软件工程,计算机软件与理论等专业,主要培养符合教育部门实际需要的计算机教学及应用管理 ...

  5. Day01-初识 Python

    1.CPU/内存/硬盘/操作系统 CPU :计算机的运算和处理中心,相当于人类的大脑. 内存 :暂时存储数据,临时加载数据应用程序. 硬盘 :长期存储数据. 操作系统:一个软件,连接计算机的硬件与所有 ...

  6. 网络ASI

    ASIHTTPRequest  基于底层CFNetwork框架,运行效率很高 可惜作者 停止更新,有一些潜在的BUG无人去解决 老项目 ASI + SBJson 只需要用到外面的源文件 ASI还依赖于 ...

  7. SpringSecurity框架下实现CSRF跨站攻击防御

    一.什么是CSRF 很多朋友在学习Spring Security的时候,会将CORS(跨站资源共享)和CSRF(跨站请求伪造)弄混,以为二者是一回事.其实不是,先解释一下: CORS(跨站资源共享)是 ...

  8. 编译原理 算法3.8 LR分析 c++11实现

    LR分析简介 LR分析是应用最广泛的一类分析方法,它是实用的编译器功能中最强的分析器,其特点是: 1,采用最一般的无回溯移进-规约方法. 2,可分析的文法是LL文法的真超集. 3,能够及时发现错误,及 ...

  9. C语言I作业12-学期总结

    一.我学到的内容 二.我的收获 我完成的作业: 第一次作业 C语言I博客作业02 C语言I作业004 C语言I博客作业05 C语言I博客作业06 C语言I博客作业07 C语言I博客作业08 C语言I博 ...

  10. MAC vim修改hosts文件

    在终端输入sudo vim /etc/hosts 输入密码获取写权限 输入i,执行insert插入修改操作,修改hosts文件内容 修改完成后先按ESC进入命令模式,再按shift + :,在底端出现 ...