python-进程、线程

一、解释:

相信百分之百的同学都会用到操作系统,别说不用,不用的话特么你怎么看的我的博客,而我们的操作系统你可以一遍看着我写的博客,又一遍听着音乐,说到音乐给大家推荐一首叫做"Shape of You",而我就是边听着音乐边写博客,哈哈.....;那么这里我们就要想了,我们的计算机又是怎么来运算的呢?怎么同时开启这么多任务的呢?而且还有好多任务偷偷的在后台运行着呢,只是桌面上没有显示而已。

而现在多核心多线程的计算机已经很普及,是的,这样计算的并发可以更多更快,但是在计算机刚流行的时候,很多单核CPU又怎么执行多任务的呢?毕竟CPU执行代码都是按照顺序执行的;而答案就是计算机上的操作系统轮流让各个任务交替执行,任务A执行0.01秒,切换到任务B上执行0.01秒,再切换到任务3上,这样反复下去,表面上看每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。

所以,我们在日常运行的环境中,并行执行多任务只能在多核心多线程的CPU上实现,但是我们有的时候任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。

对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。

有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。
  由于每个进程至少要干一件事,所以,一个进程至少有一个线程。当然,像Word这种复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂地交替运行,看起来就像同时执行一样。当然,真正地同时执行多线程需要多核CPU才可能实现。

总结:

应用程序--->进程--->线程

应用程序最少有一个进程,而一个进程最后有一个主线程,而一个程序可以启多个进程,一个进程可以启动多个线程,而它们都有自己的主进程和主线程,而进程和线程都是有CPU来运算,运算方式就是来回切换运算。

线程和进程Python与其它开发语言的不同,其它语言线程之间可以在多个CPU之间切换,而Python不支持多线程,只能多进程(前提是被CPU调用),所以出现了以下应用场景

应用场景:

IO密集型:多线程

计算密集型:多进程

GIL,全局解释器锁,保证同一个进程中只有一个线程同时被调用

二、线程的使用

看代码

import threading    #导入线程的模块
import time
def task(a):    #进程的函数
    time.sleep(1)    #等待一秒
    print(a)
for i in range(30):   #同时启动30个线程
    t = threading.Thread(target=task,args=[i,])   #创建了进程,target表示要创建的进程
    t.start()                #进程启动,表示开始工作
print("end")     #启动主进程

setDaemon的用法

说明:setDaemon 设置主进程是否等待子线程结束了,再结束自己,默认选项为(False)

例子: (默认选项)

import threading    #导入线程的模块
import time
def task(a):    #进程的函数
    time.sleep(1)    #等待一秒
    print(a)
for i in range(5):
    t = threading.Thread(target=task,args=[i,])   #创建了进程,target表示要创建的进程
    t.setDaemon(False)    #主进程是否等待子线程,False 是等待 True是不等待
    t.start()                #进程启动
print("end")     #启动主进程
###输出如下:
C:\Python35\python.exe D:/linux/python/day-test/day9/test1.py
end
0
2
1
3
4

非默认选项(True)

import threading    #导入线程的模块import timedef task(a):    #进程的函数    time.sleep(1)    #等待一秒    print(a)for i in range(5):    t = threading.Thread(target=task,args=[i,])   #创建了进程,target表示要创建的进程    t.setDaemon(True)    #主进程是否等待子线程,False 是等待 True是不等待    t.start()                #进程启动print("end")     #启动主进程

输出如下:
import threading    #导入线程的模块
import time
def task(a):    #进程的函数
    time.sleep(1)    #等待一秒
    print(a)
for i in range(5):
    t = threading.Thread(target=task,args=[i,])   #创建了进程,target表示要创建的进程
    t.setDaemon(True)    #主进程是否等待子线程,False 是等待 True是不等待
    t.start()                #进程启动
print("end")     #启动主进程

##下面没有等子线程就结束
C:\Python35\python.exe D:/linux/python/day-test/day9/test1.py
end

Process finished with exit code 0

join用法

import threading    #导入线程的模块
import time
def task(a):    #进程的函数
    time.sleep(3)    #等待一秒
    print(a)
for i in range(5):
    t = threading.Thread(target=task,args=[i,])   #创建了进程,target表示要创建的进程
    t.setDaemon(False)    #主进程是否等待子线程,False 是等待 True是不等待
    t.start()                #进程启动
    t.join()       #等待的最大时间,等待的是子线程的运行时间,默认为一直等
print("end")     #启动主进程
#输出:
C:\Python35\python.exe D:/linux/python/day-test/day9/test1.py
0
1
2
3
4
end

线程的锁

单个锁

import threading
import time
v = 10
#1、只能一个人使用锁
#lock = threading.Lock()  #此锁只能锁一次
lock = threading.RLock()  #此锁可以锁多层
def task(arg):
    time.sleep(2)
    #申请使用锁,其他人等待
    lock.acquire()
    lock.acquire()
    lock.acquire()
    global v
    v -= 1
    print(v)
    #释放
    lock.release()
    lock.release()
    lock.release()
for i in range(10):
    t = threading.Thread(target=task,args=(i,))
    t.start()

多个人的锁

import threading
import time
v = 10
#1、多个人使用锁

lock = threading.BoundedSemaphore(3)  #此锁可以被多人使用3代表3个人同时使用
def task(arg):
   # time.sleep(2)
    #申请使用锁,其他人等待
    lock.acquire()
    time.sleep(1)
    global v
    v -= 1
    print(v)
    #释放
    lock.release()
for i in range(10):
    t = threading.Thread(target=task,args=(i,))
    t.start()

事件锁

import requests
import threading
import time

lock = threading.Event()  #进程锁的方式
def task(arg):
    time.sleep(1)
    lock.wait()  #进程等候命令,开锁
    print(arg)
for i in range(5):
    t = threading.Thread(target=task,args=(i,))
    t.start()
while True:
    value = input(">>>>>")
    if value == "1":
        lock.set()   #开锁

#输出:
C:\Python35\python.exe D:/linux/python/day-test/day9/事件锁.py
>>>>>
>>>>>2
>>>>>1    #输入1之后开锁
>>>>>0
4
3
1
2

自定义锁,自己设置线程的锁的个数

import threading
import time
lock = threading.Condition()
def task(arg):
    time.sleep(1)
    #锁住所有线程
    lock.acquire()    #获得锁
    lock.wait()       #锁等候
    #申请使用锁,其他人等待
    print("线程",arg)
    lock.release()  #释放锁
for i in range(10):
    t = threading.Thread(target=task,args=(i,))
    t.start()
while True:
    value = input(">>>>>>>>")
    lock.acquire()        #获得锁
    lock.notify(int(value))  #设置释放的线程,你写几个上面线程释放几个
    lock.release()  #释放锁

输出:

>>>>>>>>6
>>>>>>>>线程 2
线程 4
线程 3
线程 1
线程 0
线程 8
时间: 2024-10-20 12:02:48

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 "&