协程/纤程

协程

1.纤程

先来聊起纤程:

  • 提起这个名词,应该会有很多人感到陌生,纤程是一种特定形式用户态线程,通常来讲,计算机中有许多线程,有的负责网络通信,内存读写,I/O操作等,这些线程的调用往往需要系统调用,而用户态线程的创建往往通过用户态进程创建,因此没有人比用户态进程更清楚自身的线程,此外,用户态线程更加轻量,开销小。
  • 哪里特定了?

一般来说,用户态线程的创建销毁是在应用程序内完成的,但是执行的过程通常需要通过内核态线程(用户态到内核态的切换)去执行,因此还是需要通过操作系统去执行,而纤程则不需要去依赖内核态即来执行他们.其执行和调度是在应用程序或运行库里完成的.

下面将用java展示使用纤程模型来处理生产者消费者模型:

一个常用的第三方库是Quasar,它提供了纤程和基于纤程的并发编程模型。下面是使用Quasar库解决生产者消费者问题的示例代码:

 <dependency>
            <groupId>co.paralleluniverse</groupId>
            <artifactId>quasar-core</artifactId>
            <version>0.7.4</version>
            <classifier>jdk8</classifier>
 </dependency>

将VM-POTIONs配置jar报信息

-javaagent:D:\apache-maven-3.6.1-bin\repository\co\paralleluniverse\quasar-core\0.7.4\quasar-core-0.7.4.jar

根据自己的路径自行配置

  • 主程序

    public class ProducerConsumerExample {
        public static void main(String[] args) {
            Channel<Integer> channel = Channels.newChannel(10); // 创建一个容量为10的通道
    
            // 生产者
            new Fiber<>(() -> {
                for (int i = 0; i < 20; i++) {
                    channel.send(i); // 将数据发送到通道
                }
                channel.close(); // 生产结束后关闭通道
            }).start();
    
            // 消费者
            new Fiber<>(() -> {
                Integer value;
                while ((value = channel.receive()) != null) { // 从通道接收数据
                    System.out.println("Received: " + value);
                }
            }).start();
        }
    }
    

输出结果为:

Received: 0
Received: 1
Received: 2
Received: 3
Received: 4
Received: 5
Received: 6
Received: 7
Received: 8
Received: 9
Received: 10
Received: 11
Received: 12
Received: 13
Received: 14
Received: 15
Received: 16
Received: 17
Received: 18
Received: 19

java中其实没有纤程,纤程这个概念是面向OS的,纤程只出现在Windows上


2.协程

一个进程可以拥有多个线程,多个线程同样可以拥有多个协程,协程的粒度相比线程更小,意味着他们的切换开销和内存消耗就更小,就一个进程向下以此划分的层级越多,工作的事情越详细,所牵扯到的其他的信息就越少,大概就是这么一个信息.

协程

而协程是出现在编程语言中,协程也可以有自己的栈(stackful)或者共享栈(stackless),但是寄存器现场由用户代码保存和恢复。

posted @   不会上猪的树  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示