python之多线程与多进程

1. 多进程与多线程

(1)背景:为何需要多进程或者多线程:
在同一时间里,同一个计算机系统中如果允许两个或者两个以上的进程处于运行状态,这便是多任务。多任务会带来的好处例如用户边听歌、边上网、边打印,而这些任务之间丝毫不会互相干扰。使用多进程技术,可大大提高计算机的运算速率。

(2)多进程与多线程的区别:

进程:程序在计算机上的一次执行活动。进程分为:系统进程和用户进程。

当运行一个程序时,实际就是启动了一个进程。程序是死的(静态的),进程是活的(动态的)。

线程:是程序中的一个单一的顺序控制流程。

进程是一个相互独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单元(指运行中程序的调度单位)。

区别:进程是资源分配的最小单位,线程是CPU调度的最小单位。

线程是一个进程的实体,是由表示程序运行状态的寄存器(如程序计数器、栈指针)以及堆栈组成,它是比进程更小的单位。

线程是程序中的一个执行流。一个执行流是由CPU运行程序代码并操作程序的数据所形成的。因此,线程被认为是以CPU为主体的行为。

线程不包含进程地址空间中的代码和数据,线程是计算过程在某一时刻的状态。所以,系统在产生一个线程或各个线程之间切换时,负担要比进程小得多。

线程是一个用户级的实体,线程结构驻留在用户空间中,能够被普通的用户级函数直接访问。

一个线程本身不是程序,它必须运行于一个程序(进程)之中。因此,线程可以定义为一个程序中的单个执行流。

多线程是指一个程序中包含多个执行流,多线程是实现并发的一种有效手段。一个进程在其执行过程中,可以产生多个线程,形成多个执行流。每个执行流即每个线程也有它自身的产生、存在和消亡的过程。

多线程程序设计的含义就是可以将程序任务分成几个并行的子任务。

在Windows系统中,进行CPU分配是以线程为单位的,一个进程可能由多个线程组成,这种情况更加复杂,有如下关系:

总线程数<=CPU数量,并行运行

总线程数>CPU数量,并发运行。         并行运行的效率明显高于并发运行。

 2. 多进程编程

  • 进程的概念

第一,进程是一个实体,每一个进程都有它自己的地址空间,一般情况下,包括文本区域、数据区域和堆栈区域。

文本区域:存储处理器执行的代码;

数据区域:存储变量和进程执行期间使用的动态分配的内存.

堆栈区域:存储着活动过程中调用的指令和本地变量。

第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,称其为进程。

  •  进程的特征

动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生、动态消亡的;

并发性:任何进程都可以同其他进程一起并发执行。

独立性:进程是一个能够独立运行的基本单元,同时也是系统分配资源和调度的独立单元;

异步性:进程间的相互制约,使得进程具有执行的间断性。

结构特征:进程由程序、数据、进程控制块三部分组成。

多个不同进程可以包含相同的程序:一个程序在不同数据集里就构成不同的进程,能得到不同的结果,但是在执行过程中,程序不能发生变化。

  • 进程的状态:

就绪状态:进程已经获得除处理器外所需资源,等待分配处理器资源,只要分配了处理器进程就可执行;

运行状态:进程占用处理器资源、处于此状态的进程数目小于或者等于处理器的数目;阻塞状态:由于进程等待某种条件,在条件满足之前无法继续执行。

  1. Miltiprocessing(多进程):

Multiprocessing是Python提供的非常好用的多进程包,用户只需要简单的定义一个函数,

Python就会自动地完成其他的所有事情。它支持子进程、进程间通信、数据共享、不同形式的同步,提供了包括Process、Queue、Pipe、Lock在内的各种组件。合理运用这些组件,可以轻松地完成单进程到并发执行的转换。

      创建进程Process模块:

class multiprocessing.Process(group=None,target=None,name=None,args=(),kwargs={})

其中,group为None,它的存在是为了兼容threading.Thread,target表示调用对象,name为别名,args表示调用对象的位置参数元组,kwargs表示调用对象的字典。

例如:创建函数并将其作为多个进程

import multiprocessing

import time

def worker_1(interval):

print("worker_1")

time.sleep(interval)

print("end worker_1")

def worker_2(interval):

print("worker_2")

time.sleep(interval)

print("end worker_2")

def worker_3(interval):

print("worker_3")

time.sleep(interval)

print("end worker_3")

if __name__==‘__main__‘:

p1=multiprocessing.Process(target=worker_1,args=(2,))

p2=multiprocessing.Process(target=worker_2,args=(3,))

p3=multiprocessing.Process(target=worker_3,args=(4,))

p1.start()

p2.start()

p3.start()

print("The number of CPU is:"+str(multiprocessing.cpu_count()))

for p in multiprocessing.active_children():

print("child p.name:"+p.name+"\tp.id"+str(p.pid))

#运行结果:

The number of CPU is:4

child p.name:Process-2  p.id9804

child p.name:Process-1  p.id9172

child p.name:Process-3  p.id6608

注释#:上述代码中使用multiprocessing.cpu_count()函数查看当前计算机的CPU数量,并通过语句multiprocessing.active_children()和for()循环的结合使用,能够清楚地查看当前活动的进程数。运行结果以worker_1、2、3的顺序输出,说明这三个进程间是并发执行的,所以每次开始时的输出顺序可能有所不同。

  • 守护进程Daemon
  • 进程间通信技术Queue通信和Pipe管道(用到之时再补充,不太懂--Python程序设计实用教程--杨连贺)

原文地址:https://www.cnblogs.com/chenzhijuan-324/p/10849956.html

时间: 2024-12-10 13:08:54

python之多线程与多进程的相关文章

Python的多线程和多进程模块对比测试

本文主要对比测试Python的多线程和多进程模块在CPU类型和I/O的任务操作时的效率 一 测试CPU消耗类型任务 在一台多核CPU的服务器上执行多线程代码,理论上代码执行时会利用多余的CPU核心来提升性能.但是由于Python的GIL的存在,使用多线程来执行CPU繁重的任务,未必能得到性能提升.但是GIL又必不可少,因为在Python解释器中执行线程是不安全的,也就是说为了保证Python线程执行时的安全,Python提供了一个全局锁,同一时刻,只允许一个线程获得这个全解锁并执行. CPU消耗

Python的多线程与多进程实践

最近要产生大量的”假“的电话号码,所以就写了一个自动产生电话号码程序,产生了一百万条数据,然后把数据放到一个文件中. 死跑版: # -*- coding: utf-8 -*- # 以下是中国的手机号码分段情况 # 新联通 (中国联通+中国网通)手机号码开头数字 130.131.132.145. # 155.156.185.186 # 新移动 (中国移动+中国铁通)手机号码开头数字 134.135.136.137. # 138.139.147.150.151.152.157.158.159.182

python socket多线程和多进程

在socket中,如果直接创建的话,是只能接受一个用户的请求需要实现socketserver中的handle方法,可以实现多进程并发访问 SocketServer内部使用 IO多路复用 以及 "多线程" 和 "多进程" ,从而实现并发处理多个客户端请求的Socket服务端.即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个"线程"或者"进 程" 专门负责处理当前客户端的所有请求. 1.创建一个继承自 s

python的多线程和多进程

要使用Python的多线程,首先要了解一个概念.GIL(global interpreter lock),翻译过来就是以解释器为单位的全局锁. 用过线程锁的都知道,LOCK就是用来管理住线程,让一个指定的线程先运行,其他的先暂停(等待),避免线程的混乱,尤其是在共用变量的情况下. GIL也是一样的概念,但是不同的是: 1.你可以想成他是解释器控制的 2.线程的指定是随机的 3.每个线程acquire运行机会后,可运行的内容很少(因此线程间的切换超级快) 因此,多线程看起来好像是多个线程一起运行,

python中多线程,多进程,队列笔记(一)

threading简介:If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks si

python的多线程、多进程代码示例

多线程有两种方式:thread和threading 这里应用的场景是map数据分多线程.进度写入codis的示例 这是thread的示例:thread的主进程不会等待线程 import thread,math,threading,multiprocessing,os,time def writeToCodis(prefix,key_list,result_map): # client = BfdCodis("xxx", ) begin = int(time.time()) for ke

基于Python的多线程与多进程

1.I/O密集型与计算密集型 多进程适用于I/O密集型 多进程适用于计算密集型 2.没有sleep(T)的多个死循环只能用多进程 3.模块介绍: 1)threading模块(_thread模块已淘汰)示例: 运行结果: 2)multiprocessing 模块演示: 代码结果: 3) concurrent.futures模块 执行结果: 原文地址:https://www.cnblogs.com/cepaAllium/p/11528994.html

appium 多线程还是多进程(转)

https://www.cnblogs.com/zouzou-busy/p/11440175.html 在前面我们都是使用一个机器进行测试,在做app自动化的时候,我们要测不同的机型,也就是兼容性测试,如果一台一台设备去执行,那就显的太麻烦了.所以经常需要我们启动多个设备,同时跑自动化测试用例,要跑多个设备时,首先要启动多个appium服务. 启动多个appium服务 在之前我们都是在命令行里输入appium来启动appium服务,这样启动的默认端口是4723,我们可以使用-p参数来指定端口号,

python多线程、多进程以及GIL

多线程 使用threading模块创建线程 传入一个函数 这种方式是最基本的,即调用threading中的Thread类的构造函数,然后指定参数target=func,再使用返回的Thread的实例调用start()方法,即开始运行该线程,该线程将执行函数func,当然,如果func需要参数,可以在Thread的构造函数中传入参数args=(-).示例代码如下 import threading #用于线程执行的函数 def counter(n): cnt = 0; for i in xrange