多线程编程

在多线程(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. day 42 JavaScript 基础知识部分

    一. JavaScript存放位置 <script type="text/javascript" src="JavaScript文件路径">< ...

  2. 使用Cap解决.Netcore分布式事务

    一.什么是Cap    CAP 是一个基于 .NET Standard 的 C# 库,它是一种处理分布式事务的解决方案,同样具有 EventBus 的功能,它具有轻量级.易使用.高性能等特点. 在我们 ...

  3. Linux中shell基础、重定向、管道符、环境变量

    1.什么是shell Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解释器).它接收用户输入的命令并把它送入内核去执行.起着协调用户与系统的一致性和在用户与系统之间进行交互的 ...

  4. 螺旋矩阵II

    Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral ord ...

  5. linux 精确延时

    void HeartBeat_Check_TASK(void *pdata){ struct timeval tv; struct timespec ts; int err; U32 dwcount= ...

  6. 【nodejs原理&源码赏析(3)】欣赏手术级的原型链加工艺术

    [摘要] 学习经典代码中的prototype加工 示例代码托管在:http://www.github.com/dashnowords/blogs 好的代码都差不多,烂的代码却各有各的烂法. 一. 概述 ...

  7. Nginx 404 Not Found 解决办法

    环境:宝塔Nginx面板 解决办法: 宝塔面板--站点设置-配置文件. 去掉:   error_page 404 /404.html; 前面的 # 号.

  8. 移动前端不得不了解的HTML5 head 头标签 —— link 标签

    目录 link 标签 rss订阅 不推荐的link标签 favicon 图标 link 标签 说到 link 标签,估计大家的第一反应和我一样,就是引入外部CSS样式文件的,不错,这是 link 标签 ...

  9. 学习go语言第二天-变量、常量

    编写测试程序 源码文件以_test结尾;例如:xxx_test.go 测试方法名以Test开头;例如:func TestXXXXX(t *testing.T){} 实现斐波那且数列 package f ...

  10. [TimLinux] CPU 常见架构介绍

    1. 简介 系统性能依赖硬件架构,CPU架构决定了硬件的布局.常见的CPU架构:SMP, NUMA, MPP. 2. SMP(对称多处理器) SMP:Symmetric Multiprocessing ...