python--进程/线程

进程/线程

1 进程

操作系统进程切换:

1 出现IO操作:

2 固定时间:

2 进程定义 (资源管理单位)---(容器)

进程就是一个程序在一个数据集上的一次动态执行过程,进程一般由程序、数据集、进程控制块三部分组成。

实现并发过程

进程是相互独立的。

3 线程(最小执行单位)

线程的出现是为了降低上下文切换的消耗,提供系统的并发性,并突破一个进程只能干一样的缺陷,使到进程内并发成为可能。

4 进程与线程的关系

进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配

和调度的基本单位,是操作系统结构的基础

线程则是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位

进程与线程的关系:

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源

(3)CPU分给线程,即真正在CPU上运行的是线程

5 并行和并发

并行处理(Parallel Processing)

是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作与统一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间

并发处理(concurrency Processing)

指一个时间段中有几个程序处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机(CPU)上运行

并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力,所以说,并行是并发的子集

注意:

Python败笔多线程:由于GIL,导致同一时刻,同一进程只能有一个线程被运行。多进程可以并行,多线程不能并行。

6 同步与异步

同步:在计算机领域,同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去

异步:是指进程不需要一直等待下去,而是继续执行面的操作,不管其他进程的状态,当有消息返回时系统会通知进程进行处理

7 Threading模块

 Thread类执行创建:

import threading
import time

def listen():
    print("listen to the music")
    time.sleep(3)
    print("listne stop")

def write():
    print("writing blog")
    time.sleep(5)
    print("writing stop")

t1=threading.Thread(target=listen) #生成一条线程
t2=threading.Thread(target=write) #生成第二条线程
t1.start() #启动线程
t2.start()
print("ending") #主线程

执行效果:
listen to the music
writing blog
ending
listne stop
writing stop

Thread类继承式创建:

import threading
import time
class Mythread(threading.Thread):
    def __init__(self,num):
        threading.Thread.__init__(self)
        self.num=num
    def run(self):
        print("running on number:%s"%self.num)
        time.sleep(3)
t1=Mythread(56)
t2=Mythread(73)
t1.start()
t2.start()
print("ending")

执行结果:
running on number:56
running on number:73
ending

  

Thread类的实例方法:  

Join()

t.join() : 线程对象t未执行完,会阻塞你的主线程。跟子线程没有关系

import threading
import time
from time import ctime,sleep

def Music(name):
    print("Begin listening to {name}".format(name=name,time=ctime()))
    sleep(3)
    print("end listenting{time}".format(time=ctime()))
def Blog(title):
    print("Begin recording the {title}".format(title=title,time=ctime ()))
    sleep(5)
    print("end recording the {time}".format(time=ctime()))
threads=[]
t1=threading.Thread(target=Music,args=("FILL ME",))
t2=threading.Thread(target=Blog,args=("python",))

threads.append(t1)
threads.append(t2)
if __name__ == ‘__main__‘:
    for t in threads:
        t.start()
        # t.join() # 最后出现主程序 等t1  t2执行完之后
    # t1.join()  #t1线程不结束 其他线程不能执行 先执行t1,t2 然后在执行t1结束之后再执行主线程
    t2.join() #t1 t2执行完之后再打印主程序

    print("all over %s" %ctime())

setDeamon(True)  

将线程声明为守护线程,必须在start()方法调用之前设置,如果不设置为守护线程程序会被无限挂起。

当我们在程序运行中,执行一个主线程,如果主线程有创建一个子线程 就兵分两路,分别运行,那么当主线程完成

想退出时,会检验子线程是否完成,如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是只要主线程

完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDeamon方法啦

import threading
import time
from time import ctime,sleep

def Music(name):
    print("Begin listening to {name}".format(name=name,time=ctime()))
    sleep(3)
    print("end listenting{time}".format(time=ctime()))
def Blog(title):
    print("Begin recording the {title}".format(title=title,time=ctime ()))
    sleep(5)
    print("end recording the {time}".format(time=ctime()))
threads=[]
t1=threading.Thread(target=Music,args=("FILL ME",))
t2=threading.Thread(target=Blog,args=("python",))

threads.append(t1)
threads.append(t2)
if __name__ == ‘__main__‘:
    # 守护线程跟着主线程走,t1 t2两个都设置为守护线程,主线程执行完 其他就都不执行
    # t1.setDaemon(True)  #把t1设置为守护线程,等待t2执行结束,但是t1也需要执行,正常执行
    t2.setDaemon(True) #把t2设置为守护线程,主线程结束,t2也就跟着结束,不执行
    for t in threads: #for遍历
        t.start()

    print("all over %s" %ctime())

其他方法:

Thread实例对象的方法

isAlive():返回线程是否活动的

getName():返回线程名

setName():设置线程名

threading模块提供的一些方法:

threading.currentThread(): 返回当前的线程变量。

threading.enumerate():返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。

threading.activeCount():返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

8 GIL(全局解释锁)

Python中的线程是操作系统的原生线程,python虚拟机使用一个全局解释器锁(Global Interpreter Lock)来互斥线程对python虚拟机的使用。为了支持多线程机制,一个基本的要求就是需要实现不同线程对共享资源访问的互斥,所有引入了GIL。

加在C python解释其上,为了支持多线程机制,一个基本的要求就是需要实现不同线程对共享资源访问的互斥,所以引入了GIL。

GIL:在一个线程拥有了解释器的访问权之后,其他的所有线程都必须等他它释放解释器的访问权,即使这些线程的下一条指令并不会互相影响。

在调用任何Python  C  API之前,要先获得GIL

GIL缺点:多处理器退化为单处理器;优先:避免大量的加解锁操作

GIL的影响

无论你启多个线程,你有多少个cpu,Python在执行一个进程的时候会谈定的在同一时刻只允许一个线程运行。

所有,python是无法利用多核CPU实现多线程的

这样,python对于计算机密型的任务开多线程的效率甚至不如串行(没有大量切换),但是,对于IO密集型的任务效率还是有显著提升的。

import time

def cal(n):
    sum=0
    for i in range(n):
        sum+=i

s=time.time()

# import threading
# t1=threading.Thread(target=cal,args=(10000000,))
# t2=threading.Thread(target=cal,args=(10000000,))
#
# t1.start()
# t2.start()
# t1.join()
# t2.join()
# # time 10.940000057220459
# # time 1.1090002059936523

cal(10000000)
cal(10000000)

print("time",time.time()-s)
# time 10.986999750137329
# time 1.128000020980835

计算密集型:一直在使用CPU

IO:存在大量IO操作

总结:对于计算密集型任务:Python的多线程并没有用

对于IO密集型任务:Python的多线程是有意义的

Python使用多核:开进程,弊端:开销大而且切换复杂

时间: 2024-10-21 05:44:47

python--进程/线程的相关文章

python/进程线程的总结

python/进程线程的总结 一.进程和线程的描述: 进程:最小的资源管理单位 线程:最小的执行单位 执行一个进程时就默认执行一个线程(主线程) 进程和线程的工作方式: 串行: 假如共有A.B.C任务, 串行的执行流程是第一个执行A任务,A任务执行完毕后再执行B任务,B任务执行完毕后最后执行C任务. 并发: 假如共有A.B.C任务,并行的执行流程是执行A任务一段时间,切换成B任务执行一段时间,在切换到C任务,直到A.B.C三个任务都执行完毕. 并行: 假如共有A.B.C任务,并发的执行流程是同一

python 进程 线程 协程

并发与并行:并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生.在单核CPU下的多线程其实都只是并发,不是并行. 进程是系统资源分配的最小单位,进程的出现是为了更好的利用CPU资源使到并发成为可能.进程由操作系统调度. 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能.线程共享进程的大部分资源,并参与CPU的调度, 当然线程自己也是拥有自己的资源的,例如,栈,寄存器等等.线程由操作系统调度. 协程通

python进程/线程/协成

1.谈谈对多进程多线程以及协成的理解 进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫做程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大 线程:调度执行的最小单位,也叫执行路径,不能独立存在,必须依赖进程存在,一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率. 协成:是一种用户太的轻量级线程,协成的调度完全由用户控制,协成拥有自己的寄存器上下文和栈.协成调度切换时,将寄存器上下文和

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

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

python进程线程

一.背景知识 理论基础 1.操作系统的作用: (1)隐藏丑陋复杂的硬件接口,提供良好的抽象接口 (2)管理.调度进程,并且将多个进程对硬件的竞争变得有序 2.多道技术: (1)产生背景:针对单核,实现并发(现在的主机一般是多核,name每个核都会利用多道技术,但是核与核之间没有使用多道技术切换这么一说,一个程序IO阻塞,会等到IO结束再重新调度) (2)时间上的复用(复用一个cpu的时间片)+空间上的复用(如内存中同时有多道程序) 二.进程 1.什么是进程 进程:正在进行的一个过程或者说一个任务

python 进程/线程/协程 测试

# Author: yeshengbao # -- coding: utf-8 -- # @Time : 2018/5/24 21:38 # 进程:如一个人拥有分身(分数数最好为cpu核心数)几乎同时进行做工# 线程:如这个人正在烧开水,但同时又可以在烧水时间内去吃饭,和扫地,这时线程就会对其随机选择,可能还会出现地还没扫完,水就开了,但他还会扫地{这就可能出现数据丢失}..# 协程:这个一个比线程更小的线程非常相似,但他在执行任务时,已经被规划好了,不会就行额外的时间浪费,创建时更省资源 im

python -- 进程线程专题

要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回. 子进程永远返回0,而父进程返回子进程的ID.这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用get

python 进程线程简单理解

简单的理解 1.线程:最小的执行单元:进程:最小的资源单元 2.一个程序至少有一个进程,一个进程至少有一个线程(线程可以理解为线程的容器) 3.进程在执行过程中拥有独立的内存单元,而多个线程共享内存 4.每一个独立的线程都有 程序的入口,顺序执行的序列和程序出口,但是线程不能独立执行,必须由应用程序提供多个线程执行控制 5.进程是系统进行资源分配和调度的一个独立单元 多线程的代码开启 import threading import time def sing(): print("begin to

Python - 进程/线程相关整理

进程池 Pool #检测url状态 from multiprocessing.dummy import Pool as ThreadPool import requests siteList = [] with open("all1.txt") as f: for line in f.readlines(): siteList.append(line) pool = ThreadPool() results = pool.map(requests.get, siteList) for

python进程|线程|协程

进程(Process) 1)进程就是正在运行的程序,它是操作系统中,资源分配的最小单位 (1)资源分配:分配的是cpu和内存等物理资源 (2)进程号是进程的唯一标识 2)同一个程序执行两次之后是两个进程 3)进程和进程之间的关系: 数据彼此隔离,通过socket通信 获取进程id import os res = os.getpid() # 获取当前进行id (当前子进程) print(res) res = os.getppid() # 获取父进程id print(res) # result "&