芭蕾舞女演员中的线程和响应式编程

问题描述

我刚刚开始阅读https://ballerina.io/文档,开始关注芭蕾舞女演员。当我尝试运行Hello World Parallel时,我不知道它在内部如何工作?

 import ballerina/io;
    public function main() {
        @strand {thread: "any"}
        worker w1 {
            io:println("Hello,World! #m");
        }
    
        @strand {thread: "any"}
        worker w2 {
            io:println("Hello,World! #n");
        }
        @strand {thread: "any"}
        worker w3 {
            io:println("Hello,World! #k");
        }
    }
  1. 当我运行这段代码时,在这4个或少于4个的后面有多少个线程在运行?
  2. 线程在Java中非常昂贵,当我们同时创建一个线程时,JVM会创建OS级线程,这将消耗大量内存。芭蕾舞女演员也遵循相同的方式(本机线程模型)吗?
  3. 我们可以在芭蕾舞女演员中使用轻质螺纹吗?就像Project Loom(fibers)将要引入的那样
  4. 芭蕾舞女演员是否完全支持反应式编程?
  5. 芭蕾舞女演员是否提供不妨碍MongoDB,Redis和Cassandra的连接程序包?我的意思是反应性方式

解决方法

  1. Ballerina在VM启动时配置的线程池上运行。可以使用环境变量BALLERINA_MAX_POOL_SIZE配置线程数,如果未明确提供,则默认为线程数=(逻辑cpu数X 2)。

  2. Ballerina运行时调度程序在预先配置的线程池上运行,并且与本机线程没有一对一的对应关系,控制流(通常称为线程)称为strand,并且许多线程将被映射到单个OS线程。这与green threadsuser level threads或Project Loom光纤非常相似。

  3. 您所获得的只是轻量级线程。

  4. 据我所知,响应式编程是为了应对复杂的异步系统编程的复杂性而开发的,类似于响应式编程,芭蕾舞女演员支持另一种方式来编写具有异步等待方式的异步系统(类似于C# )https://ballerina.io/learn/by-example/async.html

  5. 大多数Ballerina库都是非阻塞的(不会阻塞OS线程),这意味着使用该库的Ballerina程序看起来像是使用直接阻塞代码编写的代码,但是在幕后它们是多路复用的由Ballerina Scheduler提供。因此,如果您指的是反应式编程范式,则为“否”,但是如果您指的是非阻塞性和简单性(没有回调等),则为“是”。