当前位置: 首页 > news >正文

线程相关概念及操作

【1】线程的概念
1.线程-->进程会得到一个内存地址,进程是资源分配的基本单位线程才是真正进程里处理数据与逻辑的东西进程---》被分配一定的资源线程---》利用进程资源处理数据与逻辑
【2】进程和线程关系:
  进程与进程之间是竞争关系,竞争内存空间和资源线程和线程之间,协作关系,共同完成某个任务
【3】进程和线程开销问题
进程 > 线程
原因:一个进程相当于一个工作车间一个线程只是一个进程里的流水线线程只是在进程已经申请有的资源上进行的处理
【4】进程和线程的区别
1. 线程共享创建它的进程的地址空间; 进程具有自己的地址空间。
2.线程可以直接访问其进程的数据段; 进程具有其父进程数据段的副本。
3.线程可以直接与所在进程中的其他线程通信; 进程必须使用进程间通信与同级进程进行通信。
4.新线程很容易创建; 新进程需要复制父进程。
5.线程可以对同一进程的线程行使相当大的控制权。 进程只能控制子进程。
"""
# 创建线程---->多线程和多进程只有在阻塞的时候才能到别的地方去运行
"""
【5】创建线程的方式
方式一:
引入模块,直接创建
from threading import Thread
def work():...
if __name__ == '__main__':t1=Thread(target=work)t1.start()
方式二:
继承Thread类,重写run方法
继承了之后我的 New_Thread类他实例化的对象就是一个线程
from threading import Thread
class New_Thread(Thread):
​def __init__(self):super().__init__()def run(self):print("我是线程")
if __name__ == '__main__':t=New_Thread()t.start()

【6】多线程共享数据,多进程之间的数据是隔离开的
通过例子不难发现,线程中的数据,进行修改,在其他线程中会变
但是进程中的数据却不会
from multiprocessing import Process
from threading import Thread
num=10
def work():# 由于在局部修改全局的变量,要对局部的该变量进行等级提升global numprint(f"改变前num={num}")num+=1print(f"改变后num={num}")
def main():for i in range(4):# thread=Thread(target=work)# thread.start()# thread.join()process=Process(target=work)process.start()process.join()print(f"当前num={num}")
if __name__ == '__main__':main()
【7】线程的查看的pid与ppid与进程的区别
线程的pid是他所属的进程,因为都是由同一个进程开的线程,所以他的pid是相同的,ppid相同由于是一个主进程开的进程里的线程
每个进程有每个进程的不一样的pid,但又相同的ppid
​
def work(name):print(f"当前{name}的pid={os.getpid()}")print(f"当前{name}的ppid={os.getppid()}")
def main():for i in range(2):# th=Thread(target=work,args=(f'线程{i+1}',))# th.start()# th.join()"""当前线程1的pid=13532当前线程1的ppid=2792当前线程2的pid=13532当前线程2的ppid=2792当前主进程的pid=13532"""p=Process(target=work,args=(f'进程{i+1}',))p.start()p.join()"""当前进程1的pid=10412当前进程1的ppid=11060当前进程2的pid=16796当前进程2的ppid=11060当前主进程的pid=11060"""print(f"当前主进程的pid={os.getpid()}")
if __name__ == '__main__':main()
【8】线程服务器并发
服务端
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
from threading import Thread
​
​
class Server():def __init__(self):self.server=socket.socket()self.server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)self.server.bind(('127.0.0.1',8080))self.server.listen(5)@staticmethoddef work(sock):while True:data=sock.recv(1024)if data.decode()=='':breakprint(data.decode())sock.send(f"你好{data.decode()}".encode())def main(self):while True:sock,addr=self.server.accept()t=Thread(target=self.work,args=(sock,))t.start()#t.join()
if __name__ == '__main__':t=Server()t.main()
客户端
import socket
client=socket.socket()
client.connect(('127.0.0.1',8080))
while True:msg=input("请输入》》:")client.send(msg.encode())data=client.recv(1024)print(data.decode())
【9】守护线程
主线程结束运行后不会马上结束,而是等待其他非守护子线程结束之后才会结束
守护子线程会跟着主线程一起死
例子
from threading import Thread
from multiprocessing import Process
import timedef foo():print(f' this is foo begin')time.sleep(1)print(f' this is foo end')def func():print(f' this is func begin')time.sleep(3)print(f' this is func end')def main():t1 = Thread(target=foo)t2 = Thread(target=func)t1.daemon = Truet1.start()t2.start()print(f' this is main')if __name__ == '__main__':main()#  this is foo begin#  this is func begin#  this is main#  this is foo end#  this is func end
【十】多进程和多线程之间比较
多进程--》适合计算密集型操作
多线程--》适合IO密集型操作

http://www.lryc.cn/news/395043.html

相关文章:

  • 2024最新版若依-RuoYi-Vue3-PostgreSQL前后端分离项目部署手册教程
  • PHP源码:新闻门户系统(附管理后台+前台)
  • 15kg级弹簧刀高速巡飞无人机技术详解
  • 中国东方资产管理25届秋招北森测评笔试如何高分通过?真题考点分析看完这篇就够了
  • 简写单词BC149
  • Chapter11让画面动起来——Shader入门精要学习笔记
  • c++之命名空间详解(namespace)
  • 【大模型】在大语言模型的璀璨星河中寻找道德的北极星
  • 嵌入式Linux之Uboot简介和移植
  • 算法整理——【贪心算法练习(1)】
  • 人脸识别课堂签到系统【PyQt5实现】
  • Linux dig命令常见用法
  • 数学建模论文写作文档word
  • 嵌入式C语言面试相关知识——CPU、进程和线程相关(相关问题很多,会经常过来更新)
  • Linux学习看这一篇就够了,超超超牛的Linux基础入门
  • el-scrollbar组件使用踩坑记录
  • Linux计算机结构
  • 应用进程、SurfaceFlinger进程、HWC进程 之间的关系
  • 66.Python-web框架-Django-免费模板django-datta-able的分页的一种方式
  • Python编程学习笔记(1)--- 变量和简单数据类型
  • 第二证券:资金抱团“高股息”,超三成A股年内创历史新低!
  • ASAN排查程序中内存问题使用总结
  • day01:项目概述,环境搭建
  • Python爬虫与数据可视化:构建完整的数据采集与分析流程
  • Java---包装类与泛型
  • 如何优化 PostgreSQL 中对于复杂数学计算的查询?
  • 前端面试题27(在实际项目中,如何有效地利用Vue3的响应式系统提高性能?)
  • 掌握Vue 3生命周期:从组合式API到高效代码实践
  • 使用cgroup对pgsql进行分库资源限制
  • 【网络安全】一文带你了解什么是【网络劫持】