我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python之线程相关操作

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python之线程相关操作

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锁,互不影响。

 

 

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python之线程相关操作

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python之线程相关操作

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

C#多线程相关操作的示例分析

这篇文章主要介绍了C#多线程相关操作的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、线程异常我们在单线程中,捕获异常可以使用try-catch,代码如下所示:us
2023-06-29

.NET跨线程控件的相关操作是什么

.NET跨线程控件的相关操作是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在.NET中,如果我们在非UI线程上访问窗体上的控件的时候,会产生一个跨线程调用的异常,那么
2023-06-17

Python进程/线程/协程相关

1、获取进程ID。(getpid)os.getpid()2、获取父进程ID。(getppid)os.getppid()3、获取线程ID。(get_ident)(1)、进程内局部标识。import threadingthreading.get
2023-01-31

Python OpenCV视频文件相关操作教程

最近看了一些opencv的相关内容,这里做一下记录以及学习中的体会,和大家分享一下,下面这篇文章主要给大家介绍了关于Python OpenCV视频文件相关操作的相关资料,需要的朋友可以参考下
2022-11-13

Python 线程池模块之多线程操作代码

1、线程池模块 引入from concurrent.futures import ThreadPoolExecutor2、使用线程池 一个简单的线程池使用案例from concurrent.futures import ThreadPool
2022-06-02

【2020Python修炼记】MySQL之 库相关操作

【目录】一 系统数据库二 创建数据库三 数据库相关操作一 系统数据库information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等performance_schema: MySQL 5
【2020Python修炼记】MySQL之 库相关操作
2017-06-17

ElasticSearch学习之文档API相关操作

这篇文章主要为大家介绍了ElasticSearch学习之文档API相关操作,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-31

【2020Python修炼记】MySQL之 表相关操作

【目录】一 存储引擎介绍二 表介绍三 创建表四 查看表结构五 数据类型1、介绍2、数值类型3、日期类型4、字符串类型5、枚举类型与集合类型六 表完整性约束1、介绍2、not null与default3、 unique4、primary key5、auto_in
【2020Python修炼记】MySQL之 表相关操作
2021-06-03

python redis的连接及相关操作

1、redis连接、及存取值import redisr = redis.Redis(host="192.168.2.22",port=6379,db=2,password= "redis")r.set("name","Delia") # 在redi
python redis的连接及相关操作
2016-07-13

python对json的相关操作实例详解

本文实例分析了python对json的相关操作。分享给大家供大家参考,具体如下: 什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录