python进程和线程

进程和线程
一、进程
进程是程序的分配资源的最小单元;一个程序可以有多个进程,但只有一个主进程;
二、线程
线程是程序最小的执行单元;一个进程可以有多个线程,但是只有一个主线程;
三、总结
一个程序至少有一个进程和一个线程;
程序的工作方式:
1.单进程单线程;2.单进程多线程;3.多进程多线程;
考虑到实现的复杂性,一般最多只会采用单进程多线程的工作方式;
四、为什么要使用多线程
我们在实际生活中,希望既能一边浏览网页,一边听歌,一边打游戏。这时,如果只开一个进程,为了满足需求,CPU只能快速切换进程,但是在切换进程时会造成大量资源浪费。所以,如果是多核CPU,可以在同时运行多个进程而不用进行进程之间的切换。
然而,在实际中,比如:你在玩游戏的时候,电脑需要一边显示游戏的动态,一边你还得和同伴进行语音或语言进行沟通。这时,如果是单线程的工作方式,将会造成在操作游戏的时候就无法给同伴沟通,在和同伴沟通的时候就无法操作游戏。为了解决该问题,我们可以开启多线程来共享游戏资源,同时进行游戏操作和沟通。
五、实例
场景一:并发依次执行

如上图所示:有两个简单的函数,一个是听音乐一个是打游戏的函数。
如果按照之前的单线程方式,将会是先运行完听音乐的函数再去运行打游戏的函数,最后打印Ending。如下图所示:

一共的运行时间是6秒。并且是只能单一按照顺序依次去执行。而使用多线时,运行时间是3秒,并且是并行执行。
该情况下的多线程运行方式是,先创建线程1,再创建线程2,然后去启动线程1和线程2,并和主线程同时运行。此种情况下,若子线程先于主线程运行完毕,则子线程先关闭后主线程运行完毕关闭;若主线程先于子线程结束,则主线程要等待所有的子线程运行完毕后再关闭。
该部分代码块:

import threading
import time
def music(name):
    print(‘%s begin listen music%s‘%(name,time.ctime()))
    time.sleep(3)
    print(‘%s stop listen music%s‘ % (name, time.ctime()))
def game(name):
    print(‘%s begin play game%s‘%(name,time.ctime()))
    time.sleep(3)
    print(‘%s stop play game%s‘ % (name,time.ctime()))
if __name__ == ‘__main__‘:
    # threadl = []
    # t1 = threading.Thread(target=music,args=(‘zhang‘,))
    # t2 = threading.Thread(target=game,args=(‘zhang‘,))
    # t1.start()
    # t2.start()
    music(‘zhang‘)
    game(‘zhang‘)
    print(‘Ending now %s‘%time.ctime())

场景二:主线程等待某子线程结束后才能执行(join()函数的用法)
例如:在实际中,需要子线程在插入数据,主线程需要等待数据插入结束后才能进行查询验证操作(测试验证数据)

该部分代码块为:

import threading
import time
def music(name):
    print(‘%s begin listen music%s‘%(name,time.ctime()))
    time.sleep(5)
    print(‘%s stop listen music%s‘ % (name, time.ctime()))
def game(name):
    print(‘%s begin play game%s‘%(name,time.ctime()))
    time.sleep(3)
    print(‘%s stop play game%s‘ % (name,time.ctime()))
if __name__ == ‘__main__‘:
    threadl = []    #线程列表,用例存放线程
    #产生线程的实例
    t1 = threading.Thread(target=music,args=(‘zhang‘,)) #target是要执行的函数名(不是函数),args是函数对应的参数,以元组的形式;
    t2 = threading.Thread(target=game,args=(‘zhang‘,))
    threadl.append(t1)
    threadl.append(t2)
    #循环列表,依次执行各个子线程
    for x in threadl:
        x.start()
    #将最后一个子线程阻塞主线程,只有当该子线程完成后主线程才能往下执行
    x.join()
    print(‘Ending now %s‘%time.ctime())

该部分代码块为:

import threading
import time
def music(name):
    print(‘%s begin listen music%s‘%(name,time.ctime()))
    time.sleep(2)
    print(‘%s stop listen music%s‘ % (name, time.ctime()))
def game(name):
    print(‘%s begin play game%s‘%(name,time.ctime()))
    time.sleep(5)
    print(‘%s stop play game%s‘ % (name,time.ctime()))
if __name__ == ‘__main__‘:
    threadl = []    #线程列表,用例存放线程
    #产生线程的实例
    t1 = threading.Thread(target=music,args=(‘zhang‘,)) #target是要执行的函数名(不是函数),args是函数对应的参数,以元组的形式;
    t2 = threading.Thread(target=game,args=(‘zhang‘,))
    threadl.append(t1)
    threadl.append(t2)
    #循环列表,依次执行各个子线程
    for x in threadl:
        x.start()
    #将子线程t1阻塞主线程,只有当该子线程完成后主线程才能往下执行
    t1.join()
    print(‘Ending now %s‘%time.ctime())

六、线程守护(setDaemon()函数)
前面不管是不是用到了join()函数,主线程最后总是要得所有的子线程执行完成后且自己执行完才能关闭(以子线程为主来结束主线程)。下面,我们讲述一种以主线程为主的方法来结束主线程。
图1:无线程守护

图2:t2线程守护

该部分代码块为:

import threading
import time
def music(name):
    print(‘%s begin listen music%s‘%(name,time.ctime()))
    time.sleep(2)
    print(‘%s stop listen music%s‘ % (name, time.ctime()))
def game(name):
    print(‘%s begin play game%s‘%(name,time.ctime()))
    time.sleep(5)
    print(‘%s stop play game%s‘ % (name,time.ctime()))
if __name__ == ‘__main__‘:
    threadl = []    #线程列表,用例存放线程
    #产生线程的实例
    t1 = threading.Thread(target=music,args=(‘zhang‘,)) #target是要执行的函数名(不是函数),args是函数对应的参数,以元组的形式;
    t2 = threading.Thread(target=game,args=(‘zhang‘,))
    threadl.append(t1)
    threadl.append(t2)
    #循环列表,依次执行各个子线程
    t2.setDaemon(True) #t2线程守护
    for x in threadl:
        x.start()
    #将子线程t1阻塞主线程,只有当该子线程完成后主线程才能往下执行
    print(‘Ending now %s‘%time.ctime())

所谓’线程守护’,就是主线程不管该线程的执行情况,只要是其他子线程结束且主线程执行完毕,主线程都会关闭。也就是说:主线程不等待该守护线程的执行完再去关闭。
注意:setDaemon方法必须在start之前且要带一个必填的布尔型参数
七、自定义的方式来产生多线程

该部分代码块为:

import threading
import time
class mythread1(threading.Thread):
    ‘自定义线程‘
    def __init__(self,name):
        threading.Thread.__init__(self)
        self.name=name
    def run(self):
        ‘定义每个线程要运行的函数,此处为music函数‘
        print(‘%s begin listen music, %s‘ % (self.name, time.ctime()))
        time.sleep(5)
        print(‘%s stop listen music, %s‘ % (self.name, time.ctime()))

class mythread2(threading.Thread):
    ‘自定义线程‘
    def __init__(self,name):
        threading.Thread.__init__(self)
        self.name=name
    def run(self):
        ‘定义每个线程要运行的函数,此处为game函数‘
        print(‘%s begin play game, %s‘ % (self.name, time.ctime()))
        time.sleep(2)
        print(‘%s stop play game, %s‘ % (self.name, time.ctime()))
if __name__ == ‘__main__‘:
    threadl = []
    t1 = mythread1(‘zhang‘)
    t2 = mythread2(‘zhang‘)
    threadl.append(t1)
    threadl.append(t2)
    for x in threadl:
        x.start()
    print(‘Ending now %s‘ % time.ctime())

八、Threading的其他常用方法
getName() :获取线程名称
setName():设置线程名称
run():用以表示线程活动的方法(见七中自定义线程的run方法)
rtart():启动线程活动
is_alive():表示线程是否处于活动的状态,结果为布尔值;
threading.active_count():返回正在运行线程的数量
Threading.enumerate():返回正在运行线程的列表

该部分代码块为;

import threading
import time
def music(name):
    print(‘%s begin listen music%s‘%(name,time.ctime()))
    time.sleep(2)
    print(‘%s stop listen music%s‘ % (name, time.ctime()))
def game(name):
    print(‘%s begin play game%s‘%(name,time.ctime()))
    time.sleep(5)
    print(‘%s stop play game%s‘ % (name,time.ctime()))
if __name__ == ‘__main__‘:
    threadl = []    #线程列表,用例存放线程
    #产生线程的实例
    t1 = threading.Thread(target=music,args=(‘zhang‘,)) #target是要执行的函数名(不是函数),args是函数对应的参数,以元组的形式;
    t2 = threading.Thread(target=game,args=(‘zhang‘,))
    threadl.append(t1)
    threadl.append(t2)
    #循环列表,依次执行各个子线程
    t2.setDaemon(True) #t2线程守护,setDaemon方法必须在start之前且要带一个必填的布尔型参数
    t1.setName(‘线程1‘)   #设置线程的名字
    for x in threadl:
        print(‘线程为:‘,x.getName())   #获取线程的名字
        print(‘线程t1是否活动:‘,t1.is_alive())    #判断线t1是否处于活动状态
        x.start()
    print(‘正在运行线程的数量为:‘,threading.active_count())   #获取正处于活动状态线程的数量
    print(‘正在运行线程的数量为:‘,threading.activeCount)       #获取正处于活动状态线程的数量
    print(‘正在运行线程的list为:‘,threading.enumerate())     #获取正处于活动状态线程的list
    print(‘正在运行线程的list为:‘,threading._enumerate())   #获取正处于活动状态线程的list
    #将子线程t1阻塞主线程,只有当该子线程完成后主线程才能往下执行
    print(‘正在运行的线程为:‘,threading.current_thread().getName()) #获取当前线程的名字
    print(‘Ending now %s‘%time.ctime())

九、进程锁

原文地址:http://blog.51cto.com/10836356/2175009

时间: 2024-10-19 01:03:28

python进程和线程的相关文章

Python编程(二):Python进程、线程那点事儿

多进程,多线程编程 系统程序员.运维开发程序员在面试的时候经常会被问及一个常见问题: 进程是什么,线程是什么,进程和线程有什么区别? 不得不承认,这么多年了.这个问题依旧是个很难以招架的问题,简单地说: 进程和线程有很多类似的性质,他们都可以被CPU作为一个单元进行调度,他们都拥有自己独立的栈(stack)等等.因此线程也被称作LWP(Lightweight Process,轻量级进程):对应的进程也可以被称作为HWP(Heavyweight Process,重量级进程),从线程的角度看,进程就

python 进程、线程 (二)

一.多线程与多进程的对比 在python 进程.线程 (一)中简单的说过,CPython中的GIL使得同一时刻只能有一个线程运行,即并发执行.并且即使是多核CPU,GIL使得同一个进程中的多个线程也无法映射到多个CPU上运行,这么做最初是为了安全着想,慢慢的也成为了限制CPython性能的问题. 就像是一个线程想要执行,就必须得到GIL,否则就不能拿到CPU资源.但是也不是说一个线程在拿到CPU资源后就一劳永逸,在执行的过程中GIL可能会释放并被其他线程获取,所以说其它的线程会与本线程竞争CPU

python\进程和线程2

1  GIL全局解释器锁定义 定义:在一个线程拥有了解释器的访问权后,其他的所有线程都必须等待他释放解释器的访问权,即这些线程的下一条指令并不会互相影响. 缺点:多处理器退化为单处理器 优点:避免大量的加锁解锁操作 无论你启多少个线程,你有多少个cpu,python在执行一个进程的时候会淡定的在同一时刻只允许一个线程运行. Python是无法利用多核cpu实现多线程的 总结: 对于计算密集型任务,python的多线程并没有用 对于IO密集型任务,python的多线程是有意义的 python使用多

python进程、线程、协程

进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等. 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构--进程控制块. 进程就是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序.数据集.进程控

Python进程与线程及GIL(全局解释器锁)

MarkdownPad Document 进程与线程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种一个程序在一个数据集上的一次动态执行过程就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程是程序的一次执行活动,属于动态概念.进程一般由程序.数据集.进程控制块三部分组成. 有了进程为什么还要有线程呢? 因为进程还是有缺陷的: 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了 进程在执行的过程中如果阻塞,例

Python进程、线程、协程详解

进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等. 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构——进程控制块. 进程就是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序.数据集.进程控

[ Python - 14 ] python进程及线程编程

什么是进程: 简单来讲,进程就是操作系统中运行的程序或任务,进程和程序的区别在于进程是动态的,而程序是静态的.进程是操作系统资源管理的最小单位. 什么是线程: 线程是进程的一个实体,是cpu调度和分派的最小单位,它是比进程更小的能独立运行的基本单位,线程本身不拥有资源,但它可以与同属于一个进程的线程共享进程的资源所拥有的全部资源. python多线程编程与GIL: 为了更有效的利用多核处理,就出现了多线程编程,但是问题是线程间数据的一致性和状态的同步如果得到保证,因此python解析器引入了GI

Python 进程、线程、协程、锁机制,你知多少?

1.python的多线程到底有没有用? 2. 为什么在python里推荐使用多进程而不是多线程 3.进程.线程.协程.各种锁

python进程、线程、协程以及几种自定义线程池

Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time    def show(arg):     time.sleep(1)     print 'thread'+str(arg)    for i in range(10):     t = threading.Thread(target=show, args

Python进程与线程

进程与线程:*进程: 进程是系统中程序执行和资源分配的基本单元, 每个进程都有自己的数据段(存储数据).代码段(存储代码).堆栈段(对象和变量). # 全局变量等资源在多个进程中不能            共享, 在子进程中修改全局变量对父进程中的全局变量没有影响. *线程: 在一个进程内要同时干多件事, 就得同时运行多个"子任务", 这些子任务称为线程; 每个线程共享这个进程的所有资源(变量和数据等)和内存空间, 所以在子线程里面可以修改该            进程的变量.*多任务