python 多线程编程之进程和线程基础概念
多线程编程
在多线程(multithreaded,MT)出现之前,计算机程序的执行都是由单个步骤序列组成的,该序列组合在主机的CPU中按照同步顺序执行。无论是任务本身需要按照步骤顺序执行,还是整个过程实际上包含了多个子任务,都需要按照既定顺序方式执行。那么,如果这些子任务相互独立,没有因果关系呢,我们是不是考虑要让这些独立的任务同时进行呢?这种并行处理方式可以显著地提高整个任务的性能。这就是多线程编程。
由以上我们可以推测一下,多线程编程针对具有如下特点的编程任务是非常理想的:本质上是异步的;需要多个并发任务;每个活动的处理顺序可能是不确定的。这种编程任务可以被组织成或者划分成多个执行流,其中每个执行流都有一个指定要完成的任务。根据应用的不同,这些子任务可能需要计算出中间结果,然后合并成最终的输出结果。
计算密集型的任务可以比较容易的划分为多个子任务,而那种使用单线程处理多个外部输入源的任务就不那么简单了。如果不使用多线程,要实现这种编程任务就需要为串行程序使用一个或多个计时器,并实现一个多路复用方案。一个串行程序需要从每个IO终端通道来检查用户的输入,然而,程序在读取IO终端通道时不能阻塞,因为用户输入的到达时间是不确定的,并且阻塞回复妨碍其他IO通道的处理。串行程序必须使用非阻塞的IO或拥有计时器的阻塞IO。串行程序只有唯一的执行线程,因此他必须兼顾要执行的多个任务,确保其中的某个任务不会占用过多时间,并对用户的响应时间进行合理的分配。要想实现类似的要求,往往会造成非常复杂的控制流,难以理解和维护。
多线程编程,以及类似Queue(一种多线程队列数据结构)的共享数据机构,可以把任务规划为几个执行特定函数的线程:
- UserRequestThread:负责读取用户端的输入。程序将创建多个线程,每个客户端一个,客户端的请求将会被放入队列中。
- RequestProcessor:该线程负责从队列中获取请求并处理,为下一步的线程提供输出。
- ReplyThread:负责向用户输出,将结果传给用户,或者把数据写到本地文件系统或者数据库中
这个设计中,每个线程的逻辑都不复杂,他们都只需要一个要完成的特定作业。你只需要设计每类线程去做一件事情就可以了。
进程:
计算机程序就是存储在磁盘上的可执行的二进制文件。只有当它们被加载到内存中并被操作系统调用,才拥有生命周期。进程(有时又叫重量级进程)则是一个执行中的程序。每个进程都拥有自己的地址空间、内存、数据栈以及其他一些用于追踪执行的数据。操作系统管理者其上所有进程的执行,并尽量为它们分配时间。进程还可以通过派生新的进程来执行其他任务(不同的操作系统上叫法不同,Linux上交fork)。注意的是,每个新进程也都拥有自己的内存和数据栈等,进程之间是通过进程间通信(IPC)的方式实现信息的共享。
线程:
一般提到线程(又叫轻量级进程)的时候,默认的前提是它们都是在同一个进程下执行的,并享有相同的上下文。可以将其认为是在一个主进程或者‘主线程’中并行运行的一些‘迷你线程’
线程一般包括开始、执行顺序和结束三部分。它有一个指令指针,用于记录当前运行的上下文。当其他线程运行时,它可以被抢占(中断)和临时挂起(睡眠)。这种方式叫让步(yielding)。
同一个进程中的各个线程和主线程共享同一片数据空间,所以,相比于进程而言,线程间的通信和信息共享更能容易实现;线程一般是并发执行的。综合这两点,使得多任务间的协作成为可能。注意的是,单核CPU的前提下,真正的并发是不可能,线程一般都是这么执行的:每个线程执行一段时间,然后让步给其他线程;每个线程都有自己的任务,必要的时候,可以和其他线程进行结果通信。
另外,有共享就有风险。由于多个线程可以访问同一片数据,由于数据访问的顺序不同,可能导致结果不一致的现象。这种情况成为竟太条件(race condition)。解决方法是,大部分语言都有一些同步原语,用于线程管理器控制执行和访问。
还有就是,线程无法给与公平的执行时间。因为有些函数在完成前保持阻塞状态,如果没有专门为多线程情况进行修改,会导致CPU的时间分配像这些贪婪的函数倾斜。
总结:
线程是最小的执行单元,而进程至少由一个线程组成。如何调度进程和线程,由操作系统决定。
多进程和多线程编程,涉及到同步、数据共享的问题,需要多花功夫。
python 多线程编程之进程和线程基础概念的更多相关文章
- python并发编程之进程、线程、协程的调度原理(六)
进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...
- Java多线程1:进程与线程的概念、区别和联系
一.进程的的概念 引用线程之前进程的概念: 进程是表示资源分配的基本单位,也是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括内存空间.磁盘空间.I/O设备等.然 ...
- Python学习笔记 - day13 - 进程与线程
概述 我们都知道windows是支持多任务的操作系统. 什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务.打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多 ...
- 关于python多线程编程中join()和setDaemon()的一点儿探究
关于python多线程编程中join()和setDaemon()的用法,这两天我看网上的资料看得头晕脑涨也没看懂,干脆就做一个实验来看看吧. 首先是编写实验的基础代码,创建一个名为MyThread的 ...
- day-3 python多线程编程知识点汇总
python语言以容易入门,适合应用开发,编程简洁,第三方库多等等诸多优点,并吸引广大编程爱好者.但是也存在一个被熟知的性能瓶颈:python解释器引入GIL锁以后,多CPU场景下,也不再是并行方式运 ...
- python(40)- 进程、线程、协程及IO模型
一.操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式:向下管理硬件,向上提供接口. 操作系统进行进程切换:1.出现IO操作:2.固定时间. 固定时间很短,人感受不到.每一个应用层运行起 ...
- python多线程编程
Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...
- Python全栈【进程、线程】
Python全栈[进程.线程] 本节内容: 进程 线程 协程 I/O多路复用 进程 1.进程就是一个程序在一个数据集上的一次动态执行过程,进程是资源分配的最小单元. 2.进程一般由程序.数据集.进程控 ...
- 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)
数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...
随机推荐
- 【论文阅读】Deep Mutual Learning
文章:Deep Mutual Learning 出自CVPR2017(18年最佳学生论文) 文章链接:https://arxiv.org/abs/1706.00384 代码链接:https://git ...
- 2011-11-14:命令执行漏洞防御,PHP反序列化漏洞产生原因,笔记
命令执行漏洞防御尽量不要使用系统执行命令在进入执行命令函数方法之前,变量一定要做好过滤,对敏感字符进行转义在使用动态函数之前,确保使用的函数是指定的函数之一对PHP语言来说,不能完全控制的危险函数最好 ...
- java8 Optional优雅非空判断
java8 Optional优雅非空判断 import java.util.ArrayList;import java.util.List;import java.util.Optional; pub ...
- 【2018寒假集训 Day2】【动态规划】抢金块
抢金块 输入文件:gold.in 输出文件:gold.out 问题描述: 地面上有一些格子,每个格子上面都有金块,但不同格子上的金块有不同的价值,你一次可以跳S至T步 .如果S=2,T=4.你就可以跳 ...
- ApplicationInsights入门到精通系列(一)
在11月9号的上海.Net Conf开发者峰会上,我做了一个对Application Insights的Persentation,本来想着快速将其转化为一篇博客无赖最近忙成
- P1035 级数求和
题目描述 已知:S_n= 1+1/2+1/3+…+1/nSn=1+1/2+1/3+…+1/n.显然对于任意一个整数KK,当nn足够大的时候,S_nSn大于KK. 现给出一个整数KK(1 \le k ...
- 【Android - 进阶】之PopupWindow的使用
创建一个类继承自PopupWindow,编写自定义的PopupWindow类.示例代码如下: import android.app.Activity; import android.graphics. ...
- 关于python语言优化的一些思考
最近一直在做python工程化相关的工作,颇有心得,遂总结一下.一是为了整理思绪,二是为了解放自己健忘的大脑. python是一个C的语法糖盒子 原生的python通常都是由cpython实现,而cp ...
- Jpa支持LocalDateTime类型持久化
package com.boldseas.porscheshop.common.config; import javax.persistence.AttributeConverter; import ...
- fsockopen以Socket方式模拟HTTP下载文件
fsockopen 的功能很强大,比如前面模拟 HTTP 访问,模拟 POST/GET 请求,什么的,这里再举一个例子,那就是下载东西.比如下载 http://www.nowamagic.net//l ...