首页 > 系统相关 >[python]线程与进程的区别及代码演示

[python]线程与进程的区别及代码演示

时间:2024-09-05 19:54:30浏览次数:13  
标签:__ 演示 name python print num 线程 进程

进程与线程

多线程socket,tcp服务器实现,在最底下
区别:

关系区别:

​ 线程依赖于进程,一个进程至少会有一个线程

特点区别:

  1. 进程间的数据是相互隔离的,线程间数据是可以共享的
  2. 线程同时操作共享数据, 可能引发安全问题,需要用到互斥锁
  3. 进程的资源开销比线程大
  4. 多进程程序比 单进程多线程程序要更加的稳定

优缺点:

​ 1.进程:可以多核操作,资源开销较大

​ 2.线程:不能多核,资源开销相对较小

总结:

​ 1.线程依赖进程

​ 2.进程数据隔离,线程数据共享

​ 3.进程资源开销比线程大,更加稳定

​ 4.无论是多线程还是多进程,目的都是:充分利用CPU资源,提高效率

进程格式:

import multiprocessing
if __name__ == '__main__':
    # 创建进程p1
    p1 = multiprocessing.Process(target=目标....)
    # 参数有target进程链接对象 name进程名 args元组形式传参 kwargs字典形式传参
    #启动进程
    p1.start()

线程格式:

import threading
if __name__ == '__main__':
    t1 = threading.Thread(target=....)
    # 参数和进程一样有target进程链接对象 name进程名 args元组形式传参 kwargs字典形式传参
    #启动进程
    t1.start()

图解:

在这里插入图片描述

关系示例:

进程:

1.进程之间和main进程的关系

import multiprocessing
import time

'''
进程之间数据是相互隔离的
多进程之间针对于main进程的外部资源每个子进程都会拷贝一份进行执行
'''


# print('我是mian外')


def add_data(my_list):
    for i in range(5):
        my_list.append(i)
        print(f'添加{i}成功!')
    print(f'add_data函数:{my_list}')


def read_data(my_list):
    time.sleep(1)  # 保证add_data先执行
    print(f'read_data函数:{my_list}')


if __name__ == '__main__':
    my_list = []
    p1 = multiprocessing.Process(target=add_data, args=(my_list,))
    p1.start()
    time.sleep(1)
    print(my_list)
    time.sleep(1)
    p2 = multiprocessing.Process(target=read_data, args=(my_list,))
    p2.start()
    print('我是mian内')

2.main默认情况下主进程会等待子进程结束再结束

'''
默认情况下主进程会等待子进程结束再结束
可以设置子进程为守护进程
'''

import multiprocessing
import time


def my_method():
    for i in range(10):
        print(f'工作中...{i}')
        time.sleep(0.3)


def fun2():
    pass


if __name__ == '__main__':
    # 设置进程为守护链接
    p1 = multiprocessing.Process(target=my_method, daemon=True)
    p1.start()

    time.sleep(1)
    print('主进程结束')
    p1.kill()

线程:

1.带参数的多线程示例:

'''
线程是cpu调度资源的基本单位,进程是cpu分配资源的进本单位
进程 = 可执行程序,文件
线程 = 进程的执行路径,执行单元
无论是进程还是线程,都实现多任务的一种方式,目的都是充分利用CPU资源,提高效率
多线程带参数
target : 关联目标函数
name: 线程名或进程名
args: 以元组的形式传参数
kwargs : 以字典的形式传参数
'''
import threading, time


def coding(name, num):
    for i in range(num):
        # time.sleep(0.1)
        print(f'{name}在写代码{i}')


def music(name, num):
    for i in range(num):
        # time.sleep(0.1)
        print(f'{name}在听音乐{i}....')


if __name__ == '__main__':
    t1 = threading.Thread(target=coding, args=('小明', 200))
    t2 = threading.Thread(target=music, kwargs={'name': '小红', 'num': 200})
    t1.start()
    t2.start()

2.多线程操控资源的安全性问题,可以通过加锁来避免

无锁版:

'''
多线程的执行具有随机性,就是在强cpu的过程,谁抢到,谁执行
默认情况下主线程会等待子线程执行结束在结束
线程之间会共享当前进程的资源
多线程环境 并发 操作共享资源, 有可能引发安全问题,需要通过 线程同步(加锁) 的思想来解决
CPU的资源分配,调度:
1.均分时间片,即:每个进程(线程)占用CPU的时间都是相等的
2.抢占式调度,谁抢到,谁执行,Python用的这种
多线程并发操作共享全局变量,引发安全问题
'''
import threading
import time

num = 0

def add_num():
    global num
    for i in range(1000000):
        num += 1
    print(f'1ok:{num}')
   


def add_num2():
    global num
    for i in range(1000000):
        num += 1
    print(f'2ok:{num}')
    

if __name__ == '__main__':
    t1 = threading.Thread(target=add_num)
    t2 = threading.Thread(target=add_num2)
    t1.start()
    t2.start()
    print(num)
   

运行结果可以发现同时操作数据后,结果比我们预期的2000000要少

加锁版:

import threading
import time

num = 0
# 定义互斥锁
mutex = threading.Lock()


def add_num():
    #开启锁
    mutex.acquire()
    global num
    for i in range(1000000):
        num += 1
    print(f'1ok:{num}')
    #关闭锁
    mutex.release()


def add_num2():
    #开启锁
    mutex.acquire()  # 保证t1和t2操作num是互斥的
    global num
    for i in range(1000000):
        num += 1
    print(f'2ok:{num}') 
    #关闭锁
    mutex.release()



if __name__ == '__main__':
    t1 = threading.Thread(target=add_num)
    t2 = threading.Thread(target=add_num2)
    t1.start()
    t2.start()
    mutex.acquire()
    print(num)
    mutex.release()

这里运行就会输出我们预期的结果.

标签:__,演示,name,python,print,num,线程,进程
From: https://blog.csdn.net/weixin_57336987/article/details/141939504

相关文章

  • 【机器学习】梯度提升和随机森林的概念、两者在python中的实例以及梯度提升和随机森林
    引言梯度提升(GradientBoosting)是一种强大的机器学习技术,它通过迭代地训练决策树来最小化损失函数,以提高模型的预测性能随机森林(RandomForest)是一种基于树的集成学习算法,它通过组合多个决策树来提高预测的准确性和稳定性文章目录引言一、梯度提升1.1基本原理1.1.1......
  • 20240905_182821 python 快速体验正则表达式 获取web的url
    导入正则模块元字符\d,匹配一个数字.,匹配任意符号+,修饰左边的东西让它可以匹配一次或无穷次search方法结果=re.search(规则,目标字符串)如果匹配成功可以有结果如果匹配不成功结果就是Nonesearch的结果如果匹配成功了就会得到一个对象想要拿到匹配的值可以让这个结......
  • Python 和 Java 区别是什么?哪个运行效率高?为什么?
    一、Python和Java的区别1.编程风格•Python是一种解释型动态编程语言,语法简洁、灵活,代码较为简洁直观,注重代码的可读性和简洁性,使用缩进来表示代码块。•Java是一种编译型静态编程语言,语法相对严谨,代码风格较为规范,需要明确声明变量类型,使用大括号来表示代码块。2.......
  • 《Python 面试热门问题五》
    一、引言Python作为一种广泛应用的高级编程语言,在各个领域都有着重要的地位。在面试中,Python相关的问题常常涉及到语言的基础知识、编程技巧、常用库的使用以及实际项目经验等方面。本文将围绕五个热门的Python面试问题进行深入探讨,帮助读者更好地准备Python面试,提升......
  • 多线程
    多线程进程和线程区别并行和并发区别创建线程的方式(高频)线程包含哪些状态,状态如何的变化(高频)搜生命周期现成顺序执行java中的wait和sleep方法的不同wait必须要和syn..锁一块使用,不然报错如何停止一个正在运行的线程线程安全问题synchronized关键字底层......
  • Python编程基础与人工智能实战
    大家好,今天给大家介绍Python编程基础与人工智能实战,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。Python编程基础与人工智能实战在人工智能(AI)的广阔领域中,Python作为一门高效、易学的编程语言,凭借其丰富的库和框......
  • Python 类变动的钩子方法 属性方法
    Python类变动的钩子方法fromtypingimportListclassField:def__init__(self,name,is_user=False):self.name=nameself.is_user=is_userdef__str__(self):returnf'name={self.name},is_user={self.is_user}'classFieldQueu......
  • python——推导式
    推导式(Comprehensions)是Python中用于创建集合、列表、字典和集合的简洁语法。它们通过简化代码使其更具可读性,并且通常比使用传统循环创建对象的方式更高效。推导式有助于减少代码行数并提高代码的清晰度。1.推导式的基本概念推导式的基本思想是通过提供一个表达式和一个......
  • python——表格在Excle和Word之间的转换
    如何在Python中将Word中的表格写入Excel,以及如何将Excel中的数据写入Word。我们将使用python-docx和openpyxl这两个库来完成这项任务。1.将Word中的表格写入Excel1.1安装所需库首先,确保安装了python-docx和openpyxl:pipinstallpython-docxopenpyxl1.2从Wo......
  • python_August(迭代器、生成式)
    目录迭代器三元表达式列表推导式字典生成器拉链函数迭代器可迭代对象:只要拥有iter方法的对象就是可迭代对象,下面的除了前两个,从字符串开始都是可迭代对象height=180 #整型salary=3.2 #浮点型name='nick' #字符串hobby_list1=['run','read'] #列表hobby_tup=......