Python 多进程多线程

多任务

并发:在一段时间内交替执行多个任务

并行:在一段时间内同事一起执行多个任务

进程 Process

进程:一个程序运行在系统之上, 便称这个程序喂一个运行进程,并分配进程ID方便系统管理。操作系统进行资源分配和调度运行的基本单位

单进程 vs 多进程

+/ 如果程序向利用计算机的多核优势,让CPU同时处理一些任务,适合用多进程开发

 先挖个坑后面学

线程 thread

线程是属于进程的,一个进程可以开启多个线程,执行不同工作,是进程实际工作最小单位

同属一个进程的多个线程共享进程所拥有的全部资源

性质

执行顺序

无序,通过CPU调度决定某个线程先执行

结束顺序

主线程会等待所有子线程执行结束后再结束

基本使用

创建线程对象

thread_obj = thread.Thread(target=func) 

启动线程执行

thread_obj.start()

import threading
import timedef thread1():while True:print('thread 1')time.sleep(1)def thread2():while True:print('thread 2')time.sleep(1)if __name__ == '__main__':# create threadt1 = threading.Thread(target=thread1)t2 = threading.Thread(target=thread2)# start threadt1.start()t2.start()

等待当前线程任务执行完毕后再向下继续执行

thread_obj.join()

执行带有参数的任务

args:以元组方式进行传参 *参数顺序保持一致

kwargs:以字典的方式给任务传参  *字典key和参数名保持一致

守护线程

主线程不等待子线程执行完成,主线程执行完毕后,子线程也自动关闭

me,thod1

threading.Thread(target = work, daemon = True)

method2

线程对象.setDaemon(True)

获取线程信息

current_thread = threading.current_thread()

print(current_thread)

设置/获取名称

name = 线程对象.current_thread().getName()

线程对象.setName()

自定义线程

class Mythread(threading.Thread):def run(self):print('执行此线程', self.args)t = Mythread(args = (100, ))
t.start()

线程安全

多个线程操作可能会出现数据混乱的情况

*有些数据类型(如列表)是线程安全的

GIL锁

全局解释器锁(Global Interpreter Lock),让一个进程中同一个时刻只能有一个线程可以被CPU调用


 

Lock 同步锁

创建锁

lock_object = threading.RLock()

加锁

线程对象.acquire()

释放锁

线程对象.release() 

e.g

import  threadinglock_object = threading.Lock()loop = 1000
number = 0def _add(count):lock_object.acquire() #加锁global numberfor i in range(count):number += 1print("t1")lock_object.release() #解锁def _sub(count):lock_object.acquire() #申请锁global numberfor i in range(count):number -= 1print("t2")lock_object.release() #解锁t1 = threading.Thread(target=_add,args=(loop,))
t2 = threading.Thread(target=_sub,args=(loop,))
t1.start()
t2.start()t1.join()
t2.join()print(number)

RLock 递归锁

Lock不支持锁的嵌套,RLock支持,就是可以加多次锁

Dead Lock 死锁

由于资源竞争或者彼此通信造成阻塞

线程池

线程不是开的越多越好,开的多了可能导致系统性能降低(线程中的上下文切换),因此不建议无限制的创建线程,建议使用线程池

创建

from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor(100)   #100个线程的线程池

提交任务

pool.submit(task, sug)

等待线程池执行完毕

pool.shutdown(True)

空闲线程处理额外任务

线程池中提交一个任务,如果有空闲线程,则分配一个线程去执行,执行完毕后再将线程交还给线程池,如果没有空闲线程,则等待

future  =pool.submit(task,url)

future.add_done_callback(done) 

单例模式

import threading
import timeclass Singleton:instance = Nonelock = threading.RLock()def __init__(self,name):self.name = namedef __new__(cls, *args, **kwargs):  #*args,**kwargs 代表任意多个参数# 这两行提高效率,可要可不要if cls.instance:return cls.instancewith cls.lock:if cls.instance:return cls.instancecls.instance = object.__new__(cls)return cls.instancedef task():obj = Singleton('x')print(obj)for i in range(10):t = threading.Thread(target=task)t.start()

线程和进程对比

关系

线程依附在进程里面,没有进程就没有线程

一个进程有一个及以上线程

区别

创建进程的资源开销比创建线程的资源开销大

进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位

线程不能独立执行,必须依存在进程中

优缺点

进程:可多核,开销大

线程:不可多核,开销小

应用:

计算密集型,多进程。 e.g大量的数据计算

IO密集型,多线程 e.g 文件读写,网络数据传输

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/169516.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA的优化配置教程

前言 IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以…

Linux文件缓冲区

文章目录 1. 缓冲区现象2. 用户级和系统级缓冲区3. 缓冲区刷新4. 为什么要有缓冲区5. 文件打印的全缓冲6. 模拟实现C语言文件标准库 本章gitee代码仓库:重定向、模拟C语言文件标准库 1. 缓冲区现象 我们这里分别调用了4个差不多的函数,但是结果是有一定差…

在ubuntu sudo apt-get update 更新报错

sudo apt-get update 更新报错 解决办法: 用你自己的key 根据上图自己找 sudo gpg --keyserver keyserver.ubuntu.com --recv-keys **********运行完成有一个ok 见下图 运行命令,中间的还是上面的key复制下来即可 sudo gpg --export --armor **********…

【算法练习Day46】判断子序列不同的子序列

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 判断子序列不同的子序列总结…

【蓝桥杯选拔赛真题66】Scratch画图机器人 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析

目录 scratch画图机器人 一、题目要求 编程实现 二、案例分析 1、角色分析

[MySQL] MySQL表的基础操作

文章目录 一、创建表 1、1 SQL语法 1、2 实例演示 二、查询表 三、修改表 3、1 修改表名字 3、2 新增列(字段) 3、3 修改列类型 3、4 修改列名 3、5 删除表 四、总结 🙋‍♂️ 作者:Ggggggtm 🙋‍♂️ 👀 专…

轻松搜寻GitHub宝藏!掌握这些技巧快速找到理想项目

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推荐--…

开放领域问答机器人1

开放领域问答机器人是一种智能机器人,它不受限制,可以回答任何问题。这种机器人主要通过自然语言处理技术来理解用户的问题,并从大量的数据中获取相关信息,以提供准确的答案。它的应用领域广泛,包括客户服务、教育、医…

序列化模块-json和pickle

一、json json是所有语言都通用的一种序列化格式 ,只支持 列表、 字典、 字符串、 数字 , 字典的key必须是字符串 1、dumps、loods # 在内存中做数据转换 : # durps 数据类型 转成 字符串 序列化 # loods 字符串 转成 数据类型 反序…

能源监测管理系统有哪些作用与效果?

随着全球能源的不断增加,能源的有限性与环境问题日益严重,用能管理企业需要一种高效的方法来管理能源与利用能源,因此能源监测管理系统成为了一种不可或缺的工具。 能源监测管理系统的重要性 1、实现节能减排的目标 通过系统,可…

Flowable 外部表单

内置表单需要在每个节点中去配置,当如果多个节点使用同一套表单属性就要配置多次比较麻烦,修改的时候也要修改多次,外部表单可以定义一次,然后其它节点都去引用同一个表单属性。 外部表单需要定义一个.form后缀的文件。 外部表单…

postgresql|数据库|提升查询性能的物化视图解析

前言: 我们一般认为数字的世界是一个虚拟的世界,OK,但我们其实有些需求是和现实世界一模一样的,比如,数据库尤其是关系型数据库,希望在使用的数据库能够更快(查询速度),…