Day-26 多线程和多进程

  1. 线程类子类的用法

    • 创建线程类的子类

    • 实现run方法确定线程任务

    • 如果现实子线程中的任务需要额外的数据, 数据通过对象属性来提供

    • from threading import Thread, current_thread
      import time# 1. 创建线程类的子类
      class  DownloadThread(Thread):# 3. 如果现实子线程中的任务需要额外的数据, 数据通过对象属性来提供def __init__(self, name):super().__init__()self.m_name = name# 2. 实现run方法确定线程任务def run(self) -> None:print(f'开始下载:{self.m_name}')print(current_thread())time.sleep(2)print(f'{self.m_name}结束下载')print('外面:', current_thread())t1 = DownloadThread('天堂电影院')
      t1.start()
      
  2. 多线程图片的下载

    • import requests
      from threading import Threaddef get_image_url():"""获取所有图片的地址:return:"""url = 'https://rt.huashi6.com/front/works/rank_page'response = requests.get(url)if response.status_code == 200:result = response.json()for data in result['data']['works']['datas']:yield 'https://img2.huashi6.com/' + data['coverImage']['path']else:print('数据获取失败')class DownloadImageThread(Thread):def __init__(self, image_url: str):super(DownloadImageThread, self).__init__()self.image_url = image_urldef run(self) -> None:response = requests.get(self.image_url)image_name = self.image_url.split("/")[-1]if response.status_code == 200:with open(f'files/{image_name}', 'wb') as f:f.write(response.content)else:print(f'{image_name}下载失败!')if __name__ == '__main__':all_image_url = get_image_url()for url in all_image_url:t = DownloadImageThread(url)t.start()
      
  3. join的用法

    • from datetime import datetime
      import time
      from threading import Thread
      from random import randintdef download(name):print(f'{name}开始下载:{datetime.now()}')time.sleep(randint(2, 5))print(f'{name}下载结束:{datetime.now()}')def wait():t1.join()t2.join()t3.join()print('======================下载完成======================')if __name__ == '__main__':t1 = Thread(target=download, args=('肖申克的救赎',))t2 = Thread(target=download, args=('霸王别姬', ))t3 = Thread(target=download, args=('阿甘正传',))# 线程对象.join()  -  join操作后面的代码只有在线程对象的任务完成后才会执行# =============情况1:三个电影都下载结束才打印'电影下载结束'=============# t1.start()# t2.start()# t3.start()# t1.join()# t2.join()# t3.join()# print('电影下载结束!')# =============情况2:第一个电影下载结束后另外两个电影才同时才是下载=============# t1.start()# t1.join()# t2.start()# t3.start()# =============情况3: 在某个子线程中等三个电影结束打印'下载完成'=================t1.start()t2.start()t3.start()t4 = Thread(target=wait)t4.start()while True:input('请输入数据:')
      
  4. 多进程

    • 一个应用程序默认有一个进程(主进程), 这个进程中默认有一个线程(主线程)

    • 一个进程中可以有多个线程

    • 一个应用程序可以有多个进程

    • from multiprocessing import Process
      # Process是进程类, 在需要额外的进程的时候就创建爱你Process的对象from datetime import datetime
      import time
      from threading import Thread
      from random import randintdef download(name):print(f'{name}开始下载:{datetime.now()}')time.sleep(randint(2, 5))print(f'{name}下载结束:{datetime.now()}')if __name__ == '__main__':p1 = Process(target=download, args=('触不可及',))p2 = Process(target=download, args=('恐怖游轮',))p3 = Process(target=download, args=('大佛Plus',))p1.start()p2.start()p3.start()
      
  5. 进程中的多线程

    • from datetime import datetime
      import time
      from threading import Thread, current_thread
      from random import randint
      from multiprocessing import Process, current_processdef download(name):print(f'{name}开始下载:{datetime.now()}')print(f'当前进程:{current_process()}')print(f'当前线程:{current_thread()}')time.sleep(randint(2, 5))print(f'{name}下载结束:{datetime.now()}')def assigning_task():t1 = Thread(target=download, args=('肖申克的救赎',))t2 = Thread(target=download, args=('霸王别姬',))t3= Thread(target=download, args=('阿甘正传',))t1.start()t2.start()t3.start()if __name__ == '__main__':# 1. 在主进程的主线程中执行# download('霸王别姬')# download('hengbagui')# download('阿甘正传')# 2. 在主进程的三个子线程中执行# t1 = Thread(target=download, args=('肖申克的救赎',))# t2 = Thread(target=download, args=('霸王别姬',))# t3= Thread(target=download, args=('阿甘正传',))# t1.start()# t2.start()# t3.start()# 3. 在三个子进程的主线程中执行# p1 = Process(target=download, args=('肖申克的救赎',))# p2 = Process(target=download, args=('霸王别姬',))# p3 = Process(target=download, args=('阿甘正传',))# p1.start()# p2.start()# p3.start()# 4. 在一个子进程中的三个字线程中执行p1 = Process(target=assigning_task)p1.start()
      
  6. 线程的数据共享

    • from datetime import datetime
      import time
      from threading import Thread, current_thread
      from random import randint
      from multiprocessing import Process, current_process, Queuedef download(name, q: Queue):print(f'{name}开始下载:{datetime.now()}')time.sleep(randint(2, 5))print(f'{name}下载结束:{datetime.now()}')q.put(f'{name}数据')def add_task(q: Queue):for index in range(1, 11):t = Thread(target=download, args=(f'电影{index}', q))t.start()def get_data(q: Queue):while True:result = q.get()print(result)if result == 'end':breakif __name__ == '__main__':q = Queue()p1 = Process(target=add_task, args=(q,))p2 = Process(target=get_data, args=(q,))p1.start()p2.start()p1.join()q.put('end')# while True:#     result = q.get()#     print(result)#     if result == 'end':#         break
      
  7. 进程的数据共享

    • from datetime import datetime
      import time
      from threading import Thread, current_thread
      from random import randint
      from multiprocessing import Process, current_process, Queue# all_data = []def download(name, q: Queue):print(f'{name}开始下载:{datetime.now()}')# print(f'当前进程:{current_process()}')# print(f'当前线程:{current_thread()}')time.sleep(randint(2, 5))print(f'{name}下载结束:{datetime.now()}')# all_data.append(f'{name}的数据')# 3. 给队列添加数据q.put(f'{name}的数据')# q.get()def get_data(q: Queue):while True:result = q.get()print(result)if result == 'end':breakif __name__ == '__main__':# 1. 创建空的队列(全局变量)q = Queue()p1 = Process(target=download, args=('肖申克的救赎', q))p2 = Process(target=download, args=('霸王别姬', q))p3 = Process(target=download, args=('阿甘正传', q))p4 = Process(target=get_data, args=(q,))p1.start()p2.start()p3.start()p4.start()p1.join()p2.join()p3.join()# 添加队列结束标志q.put('end')
      

Day-26 多线程和多进程相关推荐

  1. python 多线程 廖雪峰_python中多线程与多进程中的数据共享问题

    之前在写多线程与多进程的时候,因为一般情况下都是各自完成各自的任务,各个子线程或者各个子进程之前并没有太多的联系,如果需要通信的话我会使用队列或者数据库来完成,但是最近我在写一些多线程与多进程的代码时 ...

  2. Python学习,gevent协程,多线程,多进程demo

    协程,线程,进程,多线程,多进程,线程池,本渣渣是彻底蒙蔽了,不过干就是了,二话不说写(抄)代码就是了,抄多了就明了了,说错了,写多了就会了! 关于gevent Python通过yield提供了对协程 ...

  3. python 彻底解读多线程与多进程

    title: 多线程与多进程 copyright: true top: 0 date: 2019-03-03 16:16:41 tags: 多线程多进程 categories: Python高阶笔记 ...

  4. 线程VS进程,多线程VS多进程,并行VS并发,单核cpuVS多核cpu

    目录 概论 进程VS线程 并发VS并行 多线程VS多进程 总结 概论 程序是为完成特定任务.用某种语言编写的组指令的集合.即指一段静态的代码,静态对象. 进程是程序的次执行过程, 或是正在运行的 一个 ...

  5. python多线程和多进程的使用_python多线程与多进程

    python多线程与多进程 python多线程 python中提供两个标准库thread和threading用于对线程的支持,python3中已放弃对前者的支持,后者是一种更高层次封装的线程库,接下来 ...

  6. python和c运行速度的对比实验_Python中单线程、多线程和多进程的效率对比实验...

    原标题:Python中单线程.多线程和多进程的效率对比实验 文 | 饒木陽 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下 ...

  7. python 多进程_说说Python多线程与多进程的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  8. gj11 多线程、多进程和线程池编程

    11.1 python中的GIL # coding=utf-8 # gil global interpreter lock (cpython) # python中一个线程对应于c语言中的一个线程 # ...

  9. 多线程还是多进程的选择

    我们按照多个不同的维度,来看看多线程和多进程的对比(注:因为是感性的比较,因此都是相对的,不是说一个好得不得了,另外一个差的无法忍受). 对比维度 多进程 多线程 总结 数据共享.同步 数据共享复杂, ...

  10. Python串行运算、并行运算、多线程、多进程对比实验

    Python发挥不了多核处理器的性能(据说是受限于GIL,被锁住只能用一个CPU核心,关于这个,这里有篇文章),但是可以通过Python的multiprocessing(多进程)模块或者并行运算模块( ...

最新文章

  1. void slove C语言什么意思,菜鸟求助-如何用指针法将一串字符按单词的倒序输出?如:i love yo...
  2. python装饰器实例-Python装饰器实用例子
  3. 移动游戏市场爆发背后的游戏引擎战局
  4. spring中自定义属性编辑器CustomEditorConfigurer
  5. 数据结构与算法--力扣109题将有序双向链表转换为二叉搜索树
  6. 小程序 报错 err code: 40029, errmsg: 'invalid code, hints: [ req_id: JhIay6yFe-XN5A3 ]'
  7. 教你如何用 Linux Shell脚本判断IP是否合法(多种方法)
  8. Go爬虫colly官方示例三【cryptocoinmarketcap】- 爬取加密数字货币最新市值
  9. 如何选择VC界面库产品?(四)— DSkinLite vs DirectUI
  10. 消息钩子函数入门篇(1)--基础知识
  11. 74LS165芯片单颗与级联的万能代码|2021-10-6
  12. python爬虫基础爬取用户头像实战
  13. 举个栗子!Tableau技巧(96):离线激活和停用 Linux 版 Tableau Server
  14. 在自己本地原有的镜像基础上用dockerfile加一下库进去
  15. 手机html设计规范,手机网页设计尺寸规范具体是多少?
  16. 豆豆趣事[2014年04月]
  17. 就业形势严峻,应届生应该如何做好职业规划?
  18. 软件开发搞定操作系统
  19. pycharm2017.3.3破解到2099年
  20. Vertiv公司推出业界功率密度最高的一款UPS

热门文章

  1. 高质量通信gRPC入门,有了它,谁还用Socket
  2. 深度学习中的深度是指什么_什么是深度学习
  3. 我不理解表现与数据分离。。。
  4. 螺旋城的灾难完全攻略及地图
  5. [unity] unity学习——弹球游戏
  6. android 图片浏览 app 排行版,安卓图片浏览软件哪个好_安卓图片浏览app推荐_图片浏览app软件排行...
  7. 真实有效解决Open browser failed!! Please check if you have installed the browser correctly!
  8. 2019.9.15训练总结
  9. 李智慧 - 架构师训练营 第二周
  10. 23种设计模式-工厂方法模式《辣条工厂》