返回顶部
首页 > 资讯 > 后端开发 > Python >python之线程相关操作
  • 658
分享到

python之线程相关操作

线程操作python 2023-01-30 23:01:09 658人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

1.线程: 一个进程可以有多个线程,共享一个进程的资源; 2.进程线程的区别:    进程是资源分配的最小单位,线程是程序执行的最小单位 3.python中线程模块threading, 提供的类: Thread, Lock, Rlock,

1.线程: 一个进程可以有多个线程,共享一个进程的资源;

2.进程线程的区别:

   进程是资源分配的最小单位,线程是程序执行的最小单位

3.python中线程模块threading, 提供的类: Thread, Lock, Rlock, Semaphore, Event, 等等

4.线程的创建方式

# 第一种
# from threading import Thread
# def f1(s):
#     print('我是%s' % s)
# def f2(s):
#     print('我是%s' % s)
# 
# if __name__ == '__main__':
#     t = Thread(target=f1, args=(1,))
#     t1 = Thread(target=f1, args=(2,))
#     t.start()
#     t1.start()
#     print('我是主线程')

# 第二种
from threading import Thread

class MyThread(Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name
    def run(self):
        print('%s今天还是不能皮' % self.name)
if __name__ == '__main__':
    t = MyThread('Jerry')
    t.start()
    print('主线程')

6.查看线程的进程id(同进程查看方式一样)

import os
from threading import Thread
def f1(n):
    print('1号', os.getpid())
    print('%s号线程任务' % n)
def f2(n):
    print('2号', os.getpid())
    print('%s号线程任务' % n)
if __name__ == '__main__':
    t1 = Thread(target=f1, args=(1,))
    t2 = Thread(target=f2, args=(2,))
    t1.start()
    t2.start()
    print('主线程', os.getpid())
    print('主线程')

7. 在进程之间数据是空间隔离的, 而在线程中是数据共享的

import time
from threading import Thread

#  通过对全局变量的修改来验证线程之间是数据共享的, 共享同一进程中的数据
num = 100
def f1():
    time.sleep(3)
    global  num
    num = 3
    print('子线程的num', num)

if __name__ == '__main__':
    t = Thread(target=f1)
    t.start()
    t.join() # 等待子线程运行结束才继续向下执行
    print('主线程的num', num)

8.多进程和多线程的效率对比

对于io密集型的, 多线程的时间较快

def f1():
    time.sleep(1)  #io密集型
    
if __name__ == '__main__':
    # 查看一下20个线程执行20个任务的执行时间
    t_s_time = time.time()
    t_list = []
    for i in range(5):
        t = Thread(target=f1,)
        t.start()
        t_list.append(t)
    [tt.join() for tt in t_list]
    t_e_time = time.time()
    t_dif_time = t_e_time - t_s_time
    # 查看一下20个进程执行同样的任务的执行时间
    p_s_time = time.time()
    p_list = []
    for i in range(5):
        p = Process(target=f1,)
        p.start()
        p_list.append(p)
    [pp.join() for pp in p_list]
    p_e_time = time.time()
    p_dif_time = p_e_time - p_s_time
    print('多线程的执行时间:', t_dif_time)
    print('多jincheng的执行时间:', p_dif_time)

计算型:

import time
from threading import Thread
from multiprocessing import Process

def f1():
    # 计算型:
    n = 10
    for i in range(10000000):
        n = n + i
if __name__ == '__main__':
    # 查看一下20个线程执行20个任务的执行时间
    t_s_time = time.time()
    t_list = []
    for i in range(5):
        t = Thread(target=f1,)
        t.start()
        t_list.append(t)
    [tt.join() for tt in t_list]
    t_e_time = time.time()
    t_dif_time = t_e_time - t_s_time
    # 查看一下20个进程执行同样的任务的执行时间
    p_s_time = time.time()
    p_list = []
    for i in range(5):
        p = Process(target=f1,)
        p.start()
        p_list.append(p)
    [pp.join() for pp in p_list]
    p_e_time = time.time()
    p_dif_time = p_e_time - p_s_time
    print('多线程的执行时间:', t_dif_time)
    print('多jincheng的执行时间:', p_dif_time)

 

 9.,同步,互斥锁 为了保护多线成中数据的完整性和线程间状态的同步.(同进程的锁一样)

 在线程锁中, 会产生死锁现象. 同时抢锁

import time
from threading import Thread, Lock, RLock
def f1(locA, locB):
    # print('xxxx')
    # time.sleep(0.1)
    locA.acquire()
    print('f1>>1号抢到了A锁')

    time.sleep(1)
    locB.acquire()
    print('f1>>1号抢到了B锁')
    locB.release()

    locA.release()
def f2(locA, locB):
    print('22222')
    time.sleep(0.1)
    locB.acquire()
    print('f2>>2号抢到了B锁')
    locA.acquire()
    time.sleep(1)
    print('f2>>2号抢到了A锁')
    locA.release()
    locB.release()
if __name__ == '__main__':
    locA = Lock()
    locB = Lock()
    t1 = Thread(target=f1, args=(locA, locB))
    t2 = Thread(target=f2, args=(locA, locB))
    t1.start()
    t2.start()

  递归锁解决了 死锁现象

import time
from threading import Thread, Lock, RLock

def f1(locA, locB):
    print('xxxxx')
    time.sleep(0.1)
    locA.acquire()
    print('f1>>>1号抢到了A锁')
    time.sleep(1)
    locB.acquire()
    print('f1>>>2号抢到了B锁')
    locB.release()
    locA.release()
def f2(locA, locB):
    print('22222')
    time.sleep(0.1)
    locB.acquire()
    print('f2>>>1号抢到了A锁')
    time.sleep(1)
    locA.acquire()
    print('f2>>>2号抢到了B锁')
    locA.release()
    locB.release()
if __name__ == '__main__':
    locA = locB = RLock()
    t1 = Thread(target=f1, args=(locA, locB))
    t2 = Thread(target=f2, args=(locB, locA))
    t1.start()
    t2.start()

10.多线程的程序不结束 和 多进程的程序不结束的区别

守护进程:主进程代码执行运行结束,守护进程随之结束
守护线程:守护线程会等待所有非守护线程运行结束才结束
import time
from threading import Thread
from multiprocessing import Process


# 守护进程:主进程代码执行运行结束,守护进程随之结束
# 守护线程:守护线程会等待所有非守护线程运行结束才结束
def f1():
    time.sleep(2)
    print('一号线程')

def f2():
    time.sleep(3)
    print('二号线程')
def f3():
    time.sleep(2)
    print('一号进程')

def f4():
    time.sleep(3)
    print('二号进程')
if __name__ == '__main__':
    # t1 = Thread(target=f1,)
    # t2 = Thread(target=f2,)
    # # t1.daemon = True  #  等非守护线程结束,守护线程才会结束 结果:  主线程结束  一号线程  二号线程
    # t2.daemon = True # 结果: 主线程结束      一号线程
    # t1.start()
    # t2.start()
    # print('主线程结束')
    p1 = Process(target=f3,)
    p2 = Process(target=f4,)
    # p1.daemon = True # 结果: 主进程   二号线程
    p2.daemon= True # 结果: 主进程   一号线程
    p1.start()
    p2.start()
    print('主进程')

11. GIL锁 :  cPython解释器上的一把互斥锁, Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核

Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。

 

 

 

--结束END--

本文标题: python之线程相关操作

本文链接: https://lsjlt.com/news/180788.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python之线程相关操作
    1.线程: 一个进程可以有多个线程,共享一个进程的资源; 2.进程线程的区别:    进程是资源分配的最小单位,线程是程序执行的最小单位 3.python中线程模块threading, 提供的类: Thread, Lock, Rlock,...
    99+
    2023-01-30
    线程 操作 python
  • C#多线程的相关操作讲解
    一、线程异常 我们在单线程中,捕获异常可以使用try-catch,代码如下所示: using System; namespace MultithreadingOption { ...
    99+
    2024-04-02
  • C#多线程相关操作的示例分析
    这篇文章主要介绍了C#多线程相关操作的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、线程异常我们在单线程中,捕获异常可以使用try-catch,代码如下所示:us...
    99+
    2023-06-29
  • .NET跨线程控件的相关操作是什么
    .NET跨线程控件的相关操作是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在.NET中,如果我们在非UI线程上访问窗体上的控件的时候,会产生一个跨线程调用的异常,那么...
    99+
    2023-06-17
  • Python进程/线程/协程相关
    1、获取进程ID。(getpid)os.getpid()2、获取父进程ID。(getppid)os.getppid()3、获取线程ID。(get_ident)(1)、进程内局部标识。import threading threading.ge...
    99+
    2023-01-31
    线程 进程 Python
  • Python 线程池模块之多线程操作代码
    1、线程池模块 引入 from concurrent.futures import ThreadPoolExecutor 2、使用线程池 一个简单的线程池使用案例 from concurrent.futu...
    99+
    2022-06-02
    Python 多线程 Python 线程池模块
  • Python OpenCV视频文件相关操作教程
    目录一、从文件中读取视频并播放1.创建读取视频的对象2.获取视频某些属性3.修改视频属性信息4.判断图像是否读取成功5.获取视频的一帧图像6.释放图像 二、视频文件的保存1...
    99+
    2022-11-13
    opencv打开视频文件 opencv视频读取 opencv播放视频
  • Python全栈之字符串和列表相关操作
    目录1. format格式化_填充符号使用1.1 format格式化1.2 format的填充符号的使用2. 字符串相关的方法3. 列表的相关操作4. 列表的相关函数5. 深浅拷贝小...
    99+
    2024-04-02
  • mysql相关操作
    备份数据库mysqldump -uroot -p abc > abc.sql导入数据库mysql -uroot -p abc < abc.sql创建数据库,并使之支持中文create datab...
    99+
    2024-04-02
  • 【2020Python修炼记】MySQL之 表相关操作
    【目录】 一 存储引擎介绍 二 表介绍 三 创建表 四 查看表结构 五 数据类型 1、介绍 2、数值类型 3、日期类型 4、字符串类型 5、枚举类型与集合类型 六 表完整性约束 1、介绍 2、not null与default 3...
    99+
    2021-06-03
    【2020Python修炼记】MySQL之 表相关操作
  • 【2020Python修炼记】MySQL之 库相关操作
    【目录】 一 系统数据库 二 创建数据库 三 数据库相关操作 一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等 per...
    99+
    2017-06-17
    【2020Python修炼记】MySQL之 库相关操作
  • ElasticSearch学习之文档API相关操作
    目录前言创建文档单个数据指定ID不指定IDID唯一性控制批量数据指定ID不指定ID修改文档按照ID单个全量更新基于乐观锁全量更新部分更新按照ID批量全量更新部分更新按照条件修改修改字...
    99+
    2023-01-31
    ElasticSearch文档API操作 ElasticSearch API
  • python redis的连接及相关操作
    redis连接、及存取值 import redis r = redis.Redis(host="192.168.2.22",port=6379,db=2,password= "redis") r.set("name","Delia") ...
    99+
    2016-07-13
    python redis的连接及相关操作
  • xtrabackup介绍及相关操作流程
    xtrabackup 详解    xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有开源,免费,支持在线热备,备份恢复速度快,占...
    99+
    2024-04-02
  • Python中字典的相关操作介绍
    字典的添加与修改 # coding:utf-8 if __name__ == '__main__': example = {'name': 'xie', 'age': 27...
    99+
    2024-04-02
  • 详解python的字典及相关操作
    目录什么是字典创建一个字典在原有字典上添加“键-值”对修改字典中的值删除键-值对由类似对象组成的字典遍历字典什么是字典 字典是Python中最强大的数据类型之...
    99+
    2024-04-02
  • MongoDB 用户相关操作
       在我们第一次启动MongoDB的时候,仅仅是制定了data数据目录和log日志目录,并没有指定--auth选项,也就是并不需要认证。 [root@VM-...
    99+
    2024-04-02
  • python对json的相关操作实例详解
    本文实例分析了python对json的相关操作。分享给大家供大家参考,具体如下: 什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和...
    99+
    2022-06-04
    详解 实例 操作
  • Python Django 数据库的相关操作详解
    目录前言创建对象方式一:方式二:更新对象方式一:方式二:方式三:查询检索全部对象:条件过滤:方式一:方式二:检索单个对象:总结前言 上篇已经介绍过模型相关操作,并创建好了数据库及相关...
    99+
    2024-04-02
  • Python中的字符串相关操作说明
    本篇内容介绍了“Python中的字符串相关操作说明”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!(1)切片操作:str1="hel...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作