热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

三程(进程、线程、协程)&三器(迭代器、装饰器、生成器)

进程


进程


https://www.cnblogs.com/xiaonq/p/7905347.html#i3

  • 进程是资源分配的最小单位( 内存、cpu、网络、io)
  • 一个运行起来的程序就是一个进程
    • 什么是程序(程序是我们存储在硬盘里的代码)
    • 硬盘(256G)、内存条(8G)
    • 当我们双击图标,打开程序的时候,实际上就是通过I/O操作(读写)内存条里面
    • 内存条就是我们所指的资源
    • CPU分时
      • CPU比你的手速快多了,分时处理每个线程,但是由于太快然你觉得每个线程都是独占cpu
      • cpu是计算,只有时间片到了,获取cpu,线程真正执行
      • 当你想使用 网络、磁盘等资源的时候,需要cpu的调度
  • 进程具有独立的内存空间,所以没有办法相互通信
    • 进程如何通信
      • 进程queue(父子进程通信)
      • pipe(同一程序下两个进程通信)
      • managers(同一程序下多个进程通信)
      • RabbitMQ、redis等(不同程序间通信)
  • 为什么需要进程池
    • 一次性开启指定数量的进程
      如果有十个进程,有一百个任务,一次可以处理多少个(一次性只能处理十个)
    • 防止进程开启数量过多导致服务器压力过大


线程


  • 有了进程为什么还需要线程
    • 因为进程不能同一时间只能做一个事情
  • 什么是线程
    • 线程是操作系统调度的最小单位
    • 线程是进程正真的执行者,是一些指令的集合(进程资源的拥有者)
    • 同一个进程下的读多个线程共享内存空间,数据直接访问(数据共享)
    • 为了保证数据安全,必须使用线程锁
  • GIL全局解释器锁
    • 在python全局解释器下,保证同一时间只有一个线程运行
    • 防止多个线程都修改数据
  • 线程锁(互斥锁)
    • GIL锁只能保证同一时间只能有一个线程对某个资源操作,但当上一个线程还未执行完毕时可能就会释放GIL,其他线程就可以操作了
    • 线程锁本质把线程中的数据加了一把互斥锁
      • mysql中共享锁 & 互斥锁
        • mysql共享锁:共享锁,所有线程都能读,而不能写
        • mysql排它锁:排它,任何线程读取这个这个数据的权利都没有
    • 加上线程锁之后所有其他线程,读都不能读这个数据
  • 有了GIL全局解释器锁为什么还需要线程锁
    • 因为cpu是分时使用的
  • 死锁定义
    • 两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去


协程


  • 什么是协程

    • 协程微线程,纤程,本质是一个单线程
    • 协程能在单线程处理高并发
    • 线程遇到I/O操作会等待、阻塞,协程遇到I/O会自动切换(剩下的只有CPU操作)
    • 线程的状态保存在CPU的寄存器和栈里而协程拥有自己的空间,所以无需上下文切换的开销,所以快、
  • 为甚么协程能够遇到I/O自动切换

    • 协程有一个gevent模块(封装了greenlet模块),遇到I/O自动切换
  • 协程缺点

    • 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上
    • 线程阻塞(Blocking)操作(如IO时)会阻塞掉整个程序
  • 协程最大的优点

    • 不仅是处理高并发(单线程下处理高并发)
    • 特别节省资源(500日活,用php写需要两百多态机器,但是golang只需要二十多太机器)
      • 200多台机器一年
      • 二十多天机器一年


select、epool、pool


  • select

    • 只能处理1024个连接(每一个请求都可以理解为一个连接)
    • 不能告诉用户程序,哪一个连接是活跃的
  • pool

    • 只是取消了最大1024个活跃的限制
    • 不能告诉用户程序,哪一个连接是活跃的
  • epool

    • 不仅取消了1024这个最大连接限制
    • 而且能告诉用户程序哪一个是活跃的


装饰器


  • 什么是装饰器?(What)

    • 装饰器本质是函数,用来给其他函数添加新的功能

    • 特点:不修改调用方式、不修改源代码

  • 装饰器的应用场景?(Where)

    • 用户认证,判断用户是否登录

    • 计算函数运行时间(算是一个功能、在项目里用的不多)

    • 插入日志的时候

    • redis缓存

  • 为什么使用装饰器?(Why)

    • 结合应用场景说需求
  • 如何使用装饰器?(How)

    • 装饰器求函数运行时间

```bash
import time
def timer(func): #timer(test1) func=test1
def deco(*args,**kwargs):
start_time = time.time()
func(*args,**kwargs) #run test1
stop_time = time.time()
print("running time is %s"%(stop_time-start_time))
return deco
# @timer # test1=timer(test1)
def test1():
time.sleep(3)
print("in the test1")
test1()

  • 三级装饰器

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import time
def auth(auth_type):
print("auth func:",auth_type)
def outer_wrapper(func):
def wrapper(*args, **kwargs):
print("wrapper func args:", *args, **kwargs)
print('运行前')
func(*args, **kwargs)
print('运行后')
return wrapper
return outer_wrapper
@auth(auth_type="local") # home = wrapper()
def home():
print("welcome to home page")
return "from home"
home()


生成器


  • 什么是生成器?(What)

    • 生成器就是一个特殊的迭代器
    • 一个有yield关键字的函数就是一个生成器
      • 生成器是这样一个函数,它记住上一次返回时在函数体中的位置。
      • 对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。
  • 生成器哪些场景应用?(Where)

    • 生成器是一个概念,我们平常写代码可能用的并不多,但是python源码大量使用

    • 比如我们tornado框架就是基于 生成器 协程

    • 在我们代码中使用举例

    • 比如我们要生成一百万个数据,如果用生成器非常节省空间,用列表浪费大量空间

import time
t1 = time.time()
g = (i for i in range(100000000))
t2 = time.time()
lst = [i for i in range(100000000)]
t3 = time.time()
print('生成器时间:',t2 - t1) # 生成器时间: 0.0
print('列表时间:',t3 - t2) # 列表时间: 5.821957349777222

  • 为什么使用生成器

    • 节省空间
    • 高效
  • 如何使用

#!/usr/bin/python
# -*- coding: utf-8 -*-
def read_big_file_v(fname):
block_size = 1024 * 8
with open(fname,encoding="utf8") as fp:
while True:
chunk = fp.read(block_size)
# 当文件没有更多内容时,read 调用将会返回空字符串 ''
if not chunk:
break
print(chunk)
path = r'C:\aaa\luting\edc-backend\tttt.py'
read_big_file_v(path)


迭代器


  • 什么是迭代器(What)

    • 迭代器是访问集合内元素的一种方法

      • 总是从集合内第一个元素访问,直到所有元素都被访问过结束,当调用 __next__而元素返回会引发一个,StopIteration异常
    • 有两个方法:iter next

__iter__ : 返回迭代器自身

__next__: 返回下一个元素


推荐阅读
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 字节跳动青训营:Go语言进阶培训与依赖管理深入解析
    本文详细探讨了字节跳动青训营中关于Go语言进阶培训的核心内容,重点讲解了并行与并发的区别、Goroutine的使用、CSP模型及Channel机制在并发安全中的应用,并介绍了LockWithGroup的实现方式。此外,文章还深入解析了Go语言的依赖管理机制,包括GoPath、GoVendor和GoModule的使用方法及其在依赖分发和回源过程中的作用。 ... [详细]
  • 本文深入探讨了数据库性能优化与管理策略,通过实例分析和理论研究,详细阐述了如何有效提升数据库系统的响应速度和处理能力。文章首先介绍了数据库性能优化的基本原则和常用技术,包括索引优化、查询优化和存储管理等。接着,结合实际应用场景,讨论了如何利用容器化技术(如Docker)来部署和管理数据库,以提高系统的可扩展性和稳定性。最后,文章还提供了具体的配置示例和最佳实践,帮助读者在实际工作中更好地应用这些策略。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • MySQL:不仅仅是数据库那么简单
    MySQL不仅是一款高效、可靠的数据库管理系统,它还具备丰富的功能和扩展性,支持多种存储引擎,适用于各种应用场景。从简单的网站开发到复杂的企业级应用,MySQL都能提供强大的数据管理和优化能力,满足不同用户的需求。其开源特性也促进了社区的活跃发展,为技术进步提供了持续动力。 ... [详细]
  • 在 Windows 10 系统下配置 Python 3 和 OpenCV 3 的环境时,建议使用 Anaconda 分发版以简化安装过程。Anaconda 可以从其官方网站(https://www.anaconda.com/download)下载。此外,本文还推荐了几本关于 Python 和 OpenCV 的专业书籍,帮助读者深入理解和应用相关技术。 ... [详细]
  • 来宾 | Vmware ESXi 平台下的虚拟机在线管理与技术支持
    来宾 | Vmware ESXi 平台下的虚拟机在线管理与技术支持 ... [详细]
  • 在《PHP应用性能优化实战指南:从理论到实践的全面解析》一文中,作者分享了一次实际的PHP应用优化经验。文章回顾了先前进行的一次优化项目,指出即使系统运行时间较长后出现的各种问题和性能瓶颈,通过采用一些通用的优化策略仍然能够有效解决。文中不仅详细阐述了优化的具体步骤和方法,还结合实例分析了优化前后的性能对比,为读者提供了宝贵的参考和借鉴。 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • 如何使用Python高效绘制矩形图形
    本文详细介绍了如何利用Python的Turtle库高效绘制矩形图形,适合初学者快速上手。通过具体示例代码,帮助读者理解Turtle库的基本绘图方法和技巧,同时探讨了在不同应用场景中绘制矩形的实际操作,为后续复杂图形的绘制打下坚实基础。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • 全面解析Java虚拟机:内存模型深度剖析 ... [详细]
  • 在处理大规模并发请求时,传统的多线程或多进程模型往往无法有效解决性能瓶颈问题。尽管它们在处理小规模任务时能提升效率,但在高并发场景下,系统资源的过度消耗和上下文切换的开销会显著降低整体性能。相比之下,Python 的 `asyncio` 模块通过协程提供了一种轻量级且高效的并发解决方案。本文将深入解析 `asyncio` 模块的原理及其在实际应用中的优化技巧,帮助开发者更好地利用协程技术提升程序性能。 ... [详细]
author-avatar
我只爱庄宝贝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有