本文作者:haiwai

为什么协程比线程轻量(线程和协程)

haiwai 2025-01-28 06:10:11 82
为什么协程比线程轻量(线程和协程)摘要: 今天给各位分享{为什么协程比线程轻量,以及线程和协程对应的知识点,希望对各位有所帮助,现在开始吧!关于进程、线程和协程区别1、进程、线程和协程是操作系统中三种不同的执行单元,它...

今天给各位分享{为什么协程比线程轻量,以及线程和协程对应的知识点,希望对各位有所帮助,现在开始吧!

关于进程、线程和协程区别

1、进程、线程和协程是操作系统中三种不同的执行单元,它们在资源管理和并发性上各有特点。进程是最基本的资源分配单位,每个进程都有独立的内存区域和堆栈,创建和销毁成本较高。进程通过CPU的抢占式调度实现并发,单核情况下只能交替执行,多进程通过切换快速模拟并行。

2、进程、线程和协程的关系在于它们在资源管理和调度上的不同。进程独立运行,资源隔离度高,但上下文切换开销大;线程共享资源,上下文切换快,适合I/O密集型任务;协程轻量级,适用于高并发且有大量非CPU操作的场景。在选择场景时考虑不同特性。

3、协作同步,不同进程间通过消息通信实现。一个直观的例子,将进程比喻为道路,线程则是道路上的车道。车道共享道路资源,依赖于道路存在,可以并发执行,但受交通规则(代码逻辑)控制,需同步运行。进程/线程的亲缘性则体现在多核系统中,即进程/线程在特定CPU上运行,以优化性能。

Golang面试知识点总结

1、数组与切片 切片是数组的快照,底层为一个结构体,包含长度、容量和指向数组的指针。切片赋值为结构体赋值,操作切片实质上是对数组指针的修改。值得注意的是,切片的更改会影响到所有引用其底层数组的切片实例。切片扩容 当在切片末尾添加元素时,切片长度加1。

2、全局变量要定义在函数之外,而在函数之外定义的变量只能用 var 定义。短变量声明 := 只能用于函数之内。无限递归循环,栈溢出。解析:知识点:WaitGroup 的使用。存在两个问题:修复代码:或者:运行时错误 解析:知识点:多重赋值。

3、Go语言的面试题通常会关注内存管理,包括数据类型的内存分配和逃逸分析。Go的值类型如int、string等存储在栈上,函数结束后自动释放。而引用类型如slice、map等使用指针,分配在堆上,通过垃圾回收(GC)机制管理。创建新对象使用new时,需要指定类型而不是值,它会动态申请内存并初始化为零值。

为什么协程比线程轻量(线程和协程)

什么是进程一文读懂什么是进程线程协程

协程是轻量级线程,通常称为纤程或绿色线程。协程允许一个线程内运行多个协程。协程有独立运行、调度和控制特点。协程可以分为同步和异步两种类型。在Go语言中,协程通过`go`关键字启动,实现并发执行。Go语言的线程模型包括内核线程、goroutine和逻辑处理器。Go运行时调度goroutine在逻辑处理器上执行。

进程就好比是软件开发团队,每个团队(进程)有自己的任务,管理着多个工作线程。例如,当你打开网易云音乐或QQ,它们都是独立的进程。当一个进程(如读取大文件)占用CPU时,CPU不会傻等,而是切换到其他进程,等数据返回时通过中断信号再切换回来,这就是并行调度的基础。

进程:打开任何软件,如网易云音乐、QQ等,都是一个进程的实例。进程是操作系统管理的基本单位,它包含了程序执行所需的所有资源。为了提高资源利用率,当一个进程在读取大文件时,CPU并不会等待,而是立即切换到另一个进程,这种多任务执行方式被称为并发。

线程是进程的一部分,是CPU调度和分派的最小单位。线程共享进程资源,拥有少量运行所需资源,如程序计数器、寄存器和栈。线程间通信通过共享内存完成,上下文切换快,资源开销小,但相对不稳定,易丢失数据。协程是一种用户态的轻量级线程,由用户控制调度。

什么是携程函数呢?

1、携程函数就是让出协程(线程)。当 C 函数调用了 l ua_yieldk, 当前运行的协程会挂起, 启动这个线程的 lu a_resume 调用返回。 参数 nresults 指栈上需返回给 lu a_resume 的返回值的个数。当协程再次被延续时, L ua 调用延续函数 k 继续运行被挂起()的 C 函数。

2、首先我们要理解函数的意义,函数是自变量与因变量之间所确定的一种关系,自变量可以有一个,两个,或N个,但当自变量确定时,因变量也就是确定的值了,也就是课本上常说的一对一,多对多,y是x的函数的意思是y是因变量,x是自变量,y随着x的改变而随之发生改变。

3、因为被积分项是偶函数,即f(-x)=f(x),也就是说 是基于Y轴对称的。而积分域(-无穷,0)与(0,+无穷)也是对称的,所以可以写成他的两倍,当然,携程(-无穷,0)的积分的两倍也是正确的。

用yield实现协程

1、深入理解用yield实现协程 当我们第一次调用next方法时,生成器函数开始执行,执行到yield表达式为止,但此时赋值操作并未执行。代码中,在第一次调用next的时候,生成器产生了1。第二次调用next的时候,yield表达式的值赋给了n,此时n变为了None。再次yield n时,自然生成None。接下来,我们来了解协程。

2、通过 yield 关键字,程序可以实现类似于多线程的效果,即在执行完一部分任务后暂停,等待其他任务执行,然后继续执行。send 函数则允许外部控制流进入 generator,改变其执行路径,实现协程间的任务调度。在 Python 中,协程通过 generator 函数和 yield 关键字的结合,可以实现高效、灵活的并发执行。

3、有了调度类和任务类,可以继续实现上面的功能。除了上面的两个类,task函数和代码1不同的地方就是多了个yield。运行代码,我们实现了可以调度任务,进行任务交叉运行的功能,这就是协程。协程可以将多个不同的任务交叉运行。除了实现基本的调度功能,还需要解决任务和调度器之间的通信问题。

4、我们可以认为一个线程是调用某个函数方法,协程可以控制函数方法的执行过程,转向其他函数方法,并在适当的时候切换到原来的函数方法中继续执行。python中常见的协程模块有yield、yield from、async/wait、asyncio、Gevent等。只有Gevent是第三方模块,其他都是python的内置模块。

5、协程是一种轻量级的线程,通过使用yield与send函数配合,可以实现数据的高效交换。这种机制使得协程能够灵活地暂停和恢复执行,从而实现并发处理。在生产者-消费者模型中,通过yield表达式,生产者可以将数据推送给消费者,而消费者通过send函数接收数据,这种机制简化了并发编程的复杂性。

6、我们可以和被调用的函数通信,进而可以实现一个生产者消费者模型。下面是示例代码和运行结果:运行结果如下:produce 和 consume 函数在一个线程内执行,通过调用 send 方法和 yield 互相切换,实现协程的功能。关于协程的学习,可以看我以前的推文:《协程学习笔记》、《并发时用多线程还是协程?》。

阅读
分享