14-08-07 关于程序、进程、线程,以及python中实现多线程的办法

考核题目中涉及到多线程编程,于是复习了一下系统编程里面的各种概念。

首先,程序是代码,没有活动。通过编译连接之后被加载到内存里运行时,内存活动的就是进程,这里的进程不仅仅是代码段,还包括涉及的数据等。而线程是在同一个进程下的小程序,它们可以“同时”地运行,其中会有一个主线程来控制。

接下来是多线程或着多进程的实现,两者原理基本一样,都是把CPU的时间分片然后进行分配给某个进程或者线程,也就是说在同一个时间只会有一个线程在使用CPU,但是CPU切换线程的频率非常快使得它们看上去是在同一个事件运行的。

python中实现多线程编程主要依靠两个模版,一是threading(或者thread)和Queue,前者用来创建和管理线程,后者则用来实现线程之间的消息传递。

关于threading,其中包含一个Thread类,构造时只需要提供这个线程运行的函数(target)和函数相应的参数(args)即可, 其中参数是一个元组。Thread类完成定义后使用.start()函数开始执行线程。

利用Thread类创建线程的时候有三种方式:

创建一个Tread类的实例并且传给它一个函数。

创建一个Tread类的实例并且传给它一个可调用的类对象。

派生出一个Tread类的子类,再创建这个子类的实例。

我们知道,当主线程退出时,不管其他线程是否运行完,都会被关闭。但往往我们不想让这样的事情发生,这时就需要在主函数里面调用.join()函数来进行控制,这个函数的作用是判断一个线程(Tread类)是否运行结束,结束的话继续运行代码,未结束将运行这个函数的线程挂起(sleep)。如果有多个副线程,则可以使用循环去判断每一个Tread是否结束。

关于Queue模版,提供一个供多进程使用的同步先进先出(不同于堆栈)队列,其中主要是一个Queue对象,可以把它当作一个消息队列,创建时有一个size参数来确定其大小,Queue对象函数主要有:qsize()返回队列的实时大小;empty()和full()判断队列为空或者已满;put(item,block=0)用于将item加入列表,block不为0时函数会暂停线程直到

有空间放置对象;get(block=0)用于从队列中读取一个信息,block作用同put()函数。

下面是写的一个代码和结果:

from time import ctime
from time import sleep
from Queue import Queue
from threading import Thread
from random import randint

def writeQ(queue):
	print ‘producting obj for Q...‘,
	queue.put(‘xxx‘,1)
	print ‘size now‘,queue.qsize()

def readQ(queue):
	val=queue.get(1)
	print ‘consumed item from Q... size now‘,queue.qsize()

def writer(queue,n):
	print ‘--writer start at :‘,ctime()
	for i in range(n):
		writeQ(queue)
		sleep(randint(1,3))
	print ‘--writer end at :‘,ctime()

def reader(queue,n):
	print ‘--reader start at :‘,ctime()
	for i in range(n):
		readQ(queue)
		sleep(randint(2,5))
	print ‘--reader end at :‘,ctime()

funcs=[writer,reader]
nfuncs=range(len(funcs))
threads=[]
n=randint(4,7)
q=Queue(32)

for i in nfuncs:
	t=Thread(target=funcs[i],args=(q,n))
	threads.append(t)
print ‘All start at :‘,ctime()
for i in nfuncs:
	threads[i].start()
for i in nfuncs:
	threads[i].join()
print ‘All done at :‘,ctime()

其中q是一个消息队列,writer用来向队列中写入信息,reader用来读取队列中的信息。运行结果如下:

值得一提的是打印并不是一瞬间完成的,而是慢慢一行一行的完成的。

另外我思考了一下,如果消息需要定向的投入到某个线程中怎么办,在reader很多的情况下这样的消息队列并不能确定谁会得到这个消息,初步想了下,将消息结构化让它有一个属性来表示接受方就行了。

14-08-07 关于程序、进程、线程,以及python中实现多线程的办法

时间: 2024-10-19 02:11:24

14-08-07 关于程序、进程、线程,以及python中实现多线程的办法的相关文章

程序,进程,线程的最形象理解(理解不了可以直接怼我)

备注:阅读本博客之前,需要具备一点面向对象编程的知识(很少的一部分,别慌) 关于进程的一点理解 在任何时刻需要记住一点:任何某一时刻CPU只能执行一条指令,为 一个进程服务,而不是多个进程服务. 什么是多进程? 比如你可以一边听网易音乐,一边聊天:这是两个不同的进程,这就是多进程: 但是上文说某一时刻CPU只能干一件事情,是否矛盾? 在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如1毫秒),这样用户根本感觉不出来 CPU是在轮流为多个进程服务,就好象

程序进程线程之间的区别

1.程序和进程区别: 程序: 静态的代码和数据集合:不能并发: 不具有唯一标识: 进程: 动态的程序执行过程: 可并发: 在内存中具有唯一标识: 2.进程和线程的区别: 进程:最小的资源(CPU,内存等)分配单位:创建过程会分配独立的内存空间:  更健壮: 进程之间的通信难: 线程:最小的程序执行单位:共享进程的数据:单个线程死亡后全部线程都关闭,不够健壮: 线程之间的容易通信: 原文地址:https://www.cnblogs.com/zhangcnblogs/p/11743934.html

9 异常处理 操作系统 进程线程 队列+生产消费者模型 进程同步 回调函数

异常处理 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下 异常的种类: AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportError 无法引入模块或包:基本上是路径问题或名称错误 IndentationError 语法错误(的子类) :代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访

进程线程----转自林海峰

进程与线程 一 背景知识 进程是对正在运行程序的一个抽象,进程的概念起源于操作系统,是操作系统最核心的概念,操作系统的其他所有内容都是围绕进程的概念展开的.所以想要真正了解进程,必须事先了解操作系统,点击进入 进程是操作系统提供的最古老也是最重要的抽象概念之一.即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力.将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用和空间多路复用+硬件上支持隔离),没有进程的抽象,现代计算机将不复存在. 本文将将着重介绍进

Python中的线程与进程

进程与线程 在多任务处理中,每一个任务都有自己的进程,一个任务会有很多子任务,这些在进程中开启线程来执行这些子任务.一般来说,可以将独立调度.分配的基本单元作为线程运行,而进程是资源拥有的基本单位. python支持多进程multiprocessing,以及多线程threading. 多进程 os.fork()函数可以开启一个进程.该函数会返回两次值,分别在父进程中返回子进程的ID,而在子进程中永远返回0. os.getpid()函数可以返回进程的ID.os.getppid()则可以返回父进程的

python中线程和进程相关

1.操作系统/应用程序 a : 硬盘 , CPU , 主板 , 显卡 , 内存 , 电源 ... b.装系统 (软件) 系统就是一个由程序员写出来的软件 , 该软件用于控制计算机的硬件 , 让他们之间相互进行配合. c.安软件 (安装应用程序) QQ 百度云 pycharm .... 2.操作中的"并发"   ('并行') 并发 , 伪 , 由于执行速度特别快 , 人感觉不到停顿. 并行 , 真 , 创建10个人同时操作. 3.其他语言线程 , 进程 a. 单进程 , 单线程的应用程序

python的进程/线程/协程

1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有一个线程被执行. 多线程的特点: 线程比进程更轻量级,创建一个线程要比创建一个进程快10-100倍. 线程共享全局变量. 由于GIL的原因,当一个线程遇到IO操作时,会切换到另一个线程,所以线程适合IO密集型操作. 在多核cpu系统中,最大限度的利用多核,可以开启多个线程,开销比进程小的多,但是这并

python中线程和进程(一)

目录 进程和线程 Python中的线程 1. Thread类 2. 线程的启动 3. 线程的传参 4. 线程的属性和方法 5. daemon线程和non-daemon线程 6. join方法 7. 定时器Timer 进程和线程 进程:进程是计算机中程序正在执行的实例,是系统进行资源分配和调度的基本单位. 线程:也被称为轻量级进程,是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成. 线程和进程的关系: 现代操作系统中,每一个进程都认为自己独占所有的计算机资源.进

帮你搞懂Python进程,线程与协程

本文参考原文-http://bjbsair.com/2020-03-22/tech-info/4425/在操作系统中,每一个独立运行的程序,都占有 操作系统 分配的资源,这些程序中间互不干涉,都只负责运行自己的程序代码,这就是进程. 但是当操作系统频繁的创建销毁进程时,大量的系统资源被浪费在创建和销毁的过程中.而随着多核心 cpu 的出现,线程也逐渐代替了进程,成为了操作系统 可以独立运行的基本单位. 当进程不是多线程程序时,存在于进程当中的唯一线程,便是进程本身运行的代码块. 而当多线程出现在