万远翔网站建设,嘉兴网站建设的地方,互联网是谁发明的,100个科技小制作文章目录 前言一、易混概念1.1 同步vs异步1.2 并发vs并行 二、进程#xff08;Process#xff09;2.1进程概念2.2 进程三个基本状态2.3多进程方式编程 三、线程#xff08;Thread#xff09;3.1 线程的引入3.2 线程概念3.3 多线程编程3.4 GIL对多线程的影响3.5 GIL是否意味… 文章目录 前言一、易混概念1.1 同步vs异步1.2 并发vs并行 二、进程Process2.1进程概念2.2 进程三个基本状态2.3多进程方式编程 三、线程Thread3.1 线程的引入3.2 线程概念3.3 多线程编程3.4 GIL对多线程的影响3.5 GIL是否意味着线程安全 四、协程Coroutine4.1 协程概念 总结 前言
例如随着人工智能的不断发展机器学习这门技术也越来越重要很多人都开启了学习机器学习本文就介绍了机器学习的基础内容。 首先这三者是有明显的大小关系 进程 线程 协程 一个进程可以有多个线程一个线程里面可以有多个协程 一、易混概念
1.1 同步vs异步
同步sync发出一个功能调用时在没有得到结果之前该调用就不返回或继续执行后续操作。 简 单来说同步就是必须一件一件事做等前一件做完了才能做下一件事。 异步 async当一个异步过程调用发出后调用者在没有得到结果之前就可以继续执行后续操 作。 同步和异步的区别请求发出后是否需要等待结果才能继续执行其他操作。
1.2 并发vs并行
并发Concurrency指在行但多个进程指令被快速的轮换执行使得在宏观上具有多个进程同时执行的效果但在微观上并不是同时执行的只是把时间分成若干段使多个进程快速交替的执行。
并行Parallelism有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看二者都是一起执行的。
二、进程Process
2.1进程概念
一台计算机所能利用的资源总是有限的比如 CPU 在 1 秒钟之内最多执行 1 亿条指令计算机一共有6GB 的内存空间等等。因此“如何提高计算机资源的利用率”是人们一直思考的问题这个问题也一直带动着计算机硬件和软件的发展。
计算机发展早期程序的控制历经管理员批处理多任务操作系统 为了使多任务操作系统更高效地完成计算机资源的分配和回收便于管理各个程序的执行过程人们提出了“进程”的概念。 进程是一个实体结构包含程序、数据和进程控制块。每一个进程都有它自己的地址空间一般情况下包括文本区域text region、数据区域data region和堆栈stack region。 文本区域存储处理器执行的代码数据区域存储变量和进程执行期间使用的动态分配的内存堆栈区域存储着活动过程调用的指令和本地变量 进程是一个“执行中的程序”。程序是一个没有生命的实体只有处理器赋予程序生命时操作系统执行之它才能成为一个活动的实体我们称其为进程。 2.2 进程三个基本状态
进程执行时的间断性决定了进程可能具有多种状态。事实上运行中的进程可能具有以下三种基本状态。
1就绪状态Ready 进程已获得除处理器外的所需资源等待分配处理器资源只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如当一个进程由于时间片用完而进入就绪状态时排入低优先级队列当进程由I/O操作完成而进入就绪状态时排入高优先级队列。
2运行状态(Running)执行状态 进程占用处理器资源处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态)通常会自动执行系统的空闲进程。
3阻塞状态(Blocked) 由于进程等待某种条件如I/O操作或进程同步在条件满足之前无法继续执行。该事件发生前即使把处理器资源分配给该进程也无法运行。 (1) 就绪→运行态 处于就绪状态的进程当进程调度程序为之分配了CPU后该进程便由就绪状态转变成执行状态。
(2) 运行→就绪 处于执行状态的进程在其执行过程中因分配给它的一个时间片已用完而不得不让出CPU于是进 程从执行状态转变成就绪状态。
(3) 运行→阻塞 正在执行的进程因等待某种事件发生而无法继续执行时便从执行状态变成阻塞状态。
(4) 阻塞→就绪 处于阻塞状态的进程若其等待的事件已经发生于是进程由阻塞状态转变为就绪状态。
2.3多进程方式编程
from multiprocessing import Process
import os
import time# 子进程要执行的代码
def task_process(delay):num 0for i in range(delay*10000000):numiprint(f进程pid为 {os.getpid()},执行完成)if __name____main__:print( 父进程pid为 %s. % os.getpid())t0 time.time()task_process(3)task_process(3)t1 time.time()print(f顺序同步方式执行耗时 {t1-t0} )p0 Process(targettask_process, args(3,))p1 Process(targettask_process, args(3,))t2 time.time()p0.start();p1.start()p0.join();p1.join()t3 time.time()print(f多进程并发执行耗时 {t3-t2})三、线程Thread
3.1 线程的引入 早期的多任务操作系统以进程为单位管理各个程序的运行以及计算机资源的分配和回收进一步提高了计算机资源的利用率。但随着计算机硬、软件的发展人们发现还可以做进一步优化例如
操作系统将 CPU 资源从一个进程分配给另一个进程时开销较大各个进程占用的内存空间是相互独立的大大增加了进程间通信的实现难度一个进程可能会执行多个任务当某个任务因 I/O 操作暂停执行时其他任务将无法执行。
在计算机软、硬件快速发展人们计算机运行效率的要求越来越高的大背景下“线程”应运而生。
3.2 线程概念 线程是操作系统能够进行运算调度的最小单位它被包含在进程之中是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流一个进程中可以并发多个线程每条线程并行执行不同的任务比如一段程序、一个函数等。 线程和进程之间的关系类似于工厂和工人之间的关系进程好比是工厂线程就如同工厂中的工人。一个工厂可以容纳多个工人工厂负责为所有工人提供必要的资源电力、产品原料、食堂、厕所等所有工人共享这些资源每个工人负责完成一项具体的任务他们相互配合共同保证整个工厂的平稳运行。
每个进程执行前操作系统都会为其分配所需的资源包括要执行的程序代码、数据、内存空间、文件资源等。一个进程至少包含 1 个线程可以包含多个线程所有线程共享进程的资源各个线程也可以拥有属于自己的私有资源。
3.3 多线程编程
多线程概念
一个进程中拥有多≥2个线程线程之间相互协作、共同执行一个应用程序。
通常将以“多线程”方式编写的程序称为“多线程程序”将编写多线程程序的过程称为“多线程编程”将拥有多个线程的进程称为“多线程进程”。 当进程中仅包含 1 个执行程序指令的线程时该线程又称“主线程”这样的进程称为“单线程进 程”。 很多应用程序软件都是多线程程序例如 QQ 具备同时和多人聊天的能力、迅雷具备同时下载多个资源的能力、很多杀毒软件可以同时开启杀毒、清理垃圾、电脑加速等功能。
3.4 GIL对多线程的影响
import threading, timedef my_counter():total 100_000_000i 0for _ in range(total):i i1if i % (total/10) 0:print(f当前进度{i/total:.2%} )return Truedef main1():thread_ary {}start time.time()for tid in range(2):t threading.Thread(targetmy_counter)t.start()t.join() # 第1次循环,join方法引起主线程阻塞但第2个线程并没有启动所以2个线程是顺序执行的end time.time()print(f单线程顺序执行方式total_time: {end - start:.2f})def main2():thread_ary {}start time.time()for tid in range(2):t threading.Thread(targetmy_counter)t.start()thread_ary[tid] tfor i in range(2):thread_ary[i].join() # 两个线程均已启动所以两个线程是并发的end time.time()print(f多线程并发执行方式total_time: {end-start:.2f})if __name__ __main__:main1()main2()100_000_000
单线程顺序执行方式total_time: 36.82
多线程并发执行方式total_time: 36.97
1_000_000_000
单线程顺序执行方式total_time: 368.88
多线程并发执行方式total_time: 366.763.5 GIL是否意味着线程安全
并不是。GIL是用来保护Python解释器的线程安全不是用来保护用户线程的线程安全软件开发人员需要自己解决。
解释器本身有大量的变量是需要进行保护的。假设没有GIL时两个线程都需要抛出异常那么异常应该如何存储和处理改变解释器的状态就成了问题。GIL在此环境里就限制了解释器本身只有一个线程处于运行中任意Python解释器级别操作都是串行的使得任一时间都只能有最多一个语句抛出异常。于是异常相关的共享变量就得到了保护。但对于Python程序里用户创建的线程就需要程序员自己利用threading里的设施来进行并发保护。因为一个Python语句往往对应了底层的多个Python解释器操作这些操作的执行顺序可能会被操作系统的抢占式多任务打乱的。所以不得不进行保护。 举个例子打印语句 print(hello world) 其底层就至少可以分为3个操作现实中可能操作更多 sys.sdout.write(hello world) sys.stdout.write(\n) sys.stdout.flush() 所以在多个线程一起执行 print(“hello world”) 时屏幕上就可能看到同一行里多个hello world这就是语句内部的操作被抢占式多任务打乱的结果。 四、协程Coroutine
4.1 协程概念
是一个更小的概念它是位于线程内部完全受程序所控制开销小协程又称微线程也称为用户级线程在不开辟线程的基础上完成多任务也就是在单线程的情况下完成多任务多个任务按照一定顺序交替执行它的特点就是运行效率极高。 总结
提示这里对文章进行总结
例如以上就是今天要讲的内容本文仅仅简单介绍了pandas的使用而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。