协程池与新脚本语言

今天的主人公名为——Melang。

这是一款使用C语言开发的“新”的脚本语言,然而其已经默默问世了6年之久。

下面笔者就带你走进Melang world。
在这里插入图片描述

What is Melang

Melang是一款协程并发脚本语言。它是一款解释型,而非编译型语言。

在Melang中,每一个脚本任务都是一个协程。而多个脚本任务即可以同时在同一个线程中处理,也可以在多个线程间处理。

这与Go的协程非常相似,但是Melang中的协程并不需要主动让出cpu执行权限或者调用特定函数来间接让出CPU执行权限。而是按解释器执行一定操作后自动切换任务执行。这也就免除了开发者需要考虑切换时机的问题。

在Melang中,所有的脚本代码逻辑都是同步的。但是实际都是由解释器异步进行的。这就免除了很多对异步编程不熟悉的开发者的上手难度。

同时,为了让开发者可以更快的入手,语言的语法与C语言非常相似,因此对C熟悉的开发者将会很容易上手开发。

下面那就让我们一起Hello, world!

//hello.m
sys = import('sys');

sys.print("Hello, World!")

执行:

$ melang hello.m

你将看到:

Hello, World!

协程并发与协程池

在Melang中,每一个脚本任务都是相互隔离的。然而有时我们也需要让不同任务之间可以相互通信来彼此协作,因此Melang的库函数中提供了消息队列模块,使得这一想法成为可能。

然而基于这一机制,我们很容易衍生出一种新的池结构模型——协程池。

即,主协程可用于分配资源,而一组工作协程可以通过消息机制接收资源并各自进行处理。这与传统的线程池模型非常相似。

下面我们就来看一个使用协程池实现的最简单的HTTP服务器:

/* filename: server.m */
net = import('net');
mq = import('mq');

listenfd = net.tcp_listen('127.0.0.1', '80');
for (i = 0; i < 4; ++i) {
    eval('coroutine.mln', i);
}
while (1) {
    fd = net.tcp_accept(listenfd);
    mq.send('test', fd);
}
/* filename: coroutine.m */
sys = import('sys');
net = import('net');
mq = import('mq');

sys.print(EVAL_DATA);
while (1) {
    fd = mq.recv('test');
    ret = net.tcp_recv(fd);
    if (ret) {
        net.tcp_send(fd, "HTTP/1.1 200 OK\r\nContent-Length: 1\r\n\r\na\r\n\r\n");
    }fi
    net.tcp_close(fd);
}

这两个代码文件分别为:主协程(server.m)与工作协程(coroutine.m)。

主协程(server.m)创建了4个工作协程(coroutine.m),然后就进入死循环等待客户端TCP的建立。

工作协程(coroutine.m)则是在死循环中,从主协程处收到已建立的TCP套接字,然后从TCP上收取请求,然后发送HTTP响应,最后关闭套接字。

下面,我们可以在命令行中使用如下命令启动脚本:

$ melang server.m -t=2

这里,-t=2的含义是,让解释器启动两个线程来处理这5个协程(1-server + 4-coroutine)。

启动后,就可以使用curl或者ab之类的工具进行访问了。

小结

综上,Melang是一个:

  • 脚本语言
  • 抢占式任务调度语言
  • 协程并发语言
  • 同步代码异步执行的语言

除此之外,Melang还融合了响应式编程、运算符重载、反射、注入等等特色。

感谢您的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/299040.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络期末知识汇总

一、计算机网络概述 1.Internet 的中文译名并不统一。 现有的 Internet 译名有两种&#xff1a; 因特网&#xff0c;这个译名是全国科学技术名词审定委员会推荐的&#xff0c;但却长期未得 到推广&#xff1b; 互联网&#xff0c;这是目前流行最广的、事实上的标准译名。现…

如何在 iPhone 上检索已删除的短信:6个有效方法分享

您是否错误地删除了 iPhone 上的重要短信&#xff1f;或者您可能删除了“消息”应用程序中的整个对话并想将其恢复&#xff1f;无论您的情况如何&#xff0c;有一些数据恢复方法可以帮助您恢复 iPhone 上已删除的邮件。 在本文中&#xff0c;我们将介绍在 iPhone 上恢复丢失、…

大数据 MapReduce如何让数据完成一次旅行?

专栏上一期我们聊到MapReduce编程模型将大数据计算过程切分为Map和Reduce两个阶段&#xff0c;先复习一下&#xff0c;在Map阶段为每个数据块分配一个Map计算任务&#xff0c;然后将所有map输出的Key进行合并&#xff0c;相同的Key及其对应的Value发送给同一个Reduce任务去处理…

idea 以文本形式输出 SpringBoot项目 目录结构

第1步&#xff1a;AltF12 打开 Terminal 终端 第2步&#xff1a;cd 到 项目路径下 第3步&#xff1a;使用 tree 命令 结果 D:. ├─.mvn │ └─wrapper ├─applog │ └─logs ├─src │ ├─main │ │ ├─java │ │ │ └─com │ │ │ └─zhangziwa …

【大数据进阶第三阶段之Hive学习笔记】Hive基础入门

目录 1、什么是Hive 2、Hive的优缺点 2.1、 优点 2.2、 缺点 2.2.1、Hive的HQL表达能力有限 2.2.2、Hive的效率比较低 3、Hive架构原理 3.1、用户接口&#xff1a;Client 3.2、元数据&#xff1a;Metastore 3.3、Hadoop 3.4、驱动器&#xff1a;Driver Hive运行机制…

设计模式之迭代器模式【行为型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

【已解决】在开启ssh和sshd状态下,XShell无法连接到VMware虚拟机中的Linux操作系统

【已解决】在开启ssh和sshd状态下&#xff0c;XShell无法连接到VMware虚拟机中的Linux操作系统 XShell无法连接到VMware虚拟机中的Linux操作系统&#xff0c;今天上线突然发现XShell无法连接到VMware虚拟机中的Linux操作系统&#xff0c;但是找了很多解决方案都没有解决&#x…

快速排序挖坑法

我们先来感受一下挖坑法的思路&#xff1a; 经过上面的图片分析&#xff0c;我们可以感受到挖坑法和hoare版本并没有太多本质上的区别&#xff08;hoare版本的思路及代码在我的上一篇博客已经写过&#xff0c;这里我就不再赘述了&#xff09;&#xff0c;只不过挖坑法似乎更易…

Qt添加资源文件

ui->setupUi(this);//1. 使用本地文件&#xff1a;ui->actionasdasdas->setIcon(QIcon("本地绝对路径"));ui->actiona1->setIcon(QIcon("C:/Users/满满/Desktop/output/picture/1.jpg"));//2. 使用资源文件&#xff1a;ui->actionasdasd…

网安入门10-文件上传(中国蚁剑)

​ 什么是文件上传漏洞——来自GPT-4 文件上传漏洞是一种常见的安全漏洞&#xff0c;它出现在Web应用程序中&#xff0c;允许攻击者上传恶意文件到服务器。这种漏洞可能导致严重的安全问题&#xff0c;例如服务器被入侵、数据泄露和应用程序功能受损。 文件上传漏洞通常由以…

【源码解析】Apache RocketMQ发送消息源码

send message源码解析 引入 send message方法作为我们经常使用的方法&#xff0c;平时我们很难去关注他底层到底做了什么。大部分人只知道通过send message方法可以将消息发送到broker&#xff0c;然后供消费者进行消费。其实不然&#xff0c;消息从客户端发送到broker&#x…

GPU的硬件架构

SM: streaming Multiprocessor 流多处理器 sm里面有多个(sp)cuda core 32个线程称为一个warp&#xff0c;一个warp是一个基本执行单元 抽象概念&#xff1a;grid 网格 block 块 thread 线程 块中的线程大小是有讲究的&#xff0c;关乎到资源的调度&#xff0c;一般是128&#x…

SSD固态硬盘的黄金原则:抱最高的希望,做最坏的打算-1

随着SSD固态硬盘日益普及&#xff0c;在个人电脑中已成为基本的配置选项。在体验SSD固态硬盘带来的性能优势的同时&#xff0c;你有没有想过一个问题&#xff0c;SSD的数据如果误删除或发生故障丢失&#xff0c;还有没有可能找回来呢&#xff1f;这也许是固态硬盘飞入寻常百姓家…

如何在 Windows 电脑上恢复硬盘数据

虽然硬盘偶尔发出安静的咔哒声无需担心&#xff0c;但响亮、持续的咔哒声&#xff08;有时称为“死亡咔哒声”&#xff09;应该认真对待。您应该尽快从发出咔嗒声的硬盘驱动器中恢复数据&#xff0c;因为它会比您想象的更快失效。我们下面的指南将探讨从点击硬盘驱动器获取数据…

【读书】《白帽子讲web安全》个人笔记Ⅱ-1

目录 第二篇 客户端脚本安全 第2章 浏览器安全 2.1同源策略 2.2浏览器沙箱 2.3恶意网址拦截 2.4高速发展的浏览器安全 第二篇 客户端脚本安全 第2章 浏览器安全 近年来随着互联网的发展&#xff0c;人们发现浏览器才是互联网最大的入口&#xff0c;绝大多数用户使用互联…

【python学习】-用matplotlib实现将二维数据绘制为三维图形(三维多线图)并实战(三维散点图)

文章目录 绘制一幅三维线图结合for循环绘制多幅三维线图&#xff08;在一幅图上&#xff09;美化图形 绘制一幅三维线图 #将二维数据绘制三维图&#xff08;三维多线图&#xff09; import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import axes3d import numpy as…

STM32F4xx之库函数

一、库函数介绍 库函数与寄存器的区别 库函数&#xff1a;不需要自己写很多代码&#xff0c;可以利用软件生成代码。使用的时候必须添加库文件。库文件是芯片厂商写好了。占用空间大。 寄存器&#xff1a;自己写的代码量大&#xff0c;没有软件生成代码。使用的时候不需要库文件…

QT c++和qml交互实例

文章目录 一、demo效果图二、c和qml交互的基本方式1、qml访问C类对象 三、关键代码1、工程结构图2、c代码MainWindow.cppMainQuickView.cppStudentInfoView.cppStudentInfoModel.cpp 3、qml代码main.qmlMainQuickTopRect.qmlMainQuickMiddleRect.qmlMainQuickMiddleTableRect.q…

@Async正确使用姿势

Async注解可以使被修饰的方法成为异步方法&#xff0c;简单且方便&#xff0c;这篇文章将教你如何正确的使用它 先谈谈大多数人对Aysnc的认识&#xff1a; 如果直接使用Async&#xff0c;未指定线程池 并且 容器内也没有beanName为taskExecutor的bean&#xff0c;则会使…

im6ull学习总结(三-3)freetype

1、Freetype简介 FreeType是一个开源的字体渲染引擎&#xff0c;主要用于将字体文件转换为位图或矢量图形&#xff0c;并在屏幕上渲染出高质量的字体。它提供了一组API&#xff0c;使开发者能够在自己的应用程序中使用和呈现字体。 FreeType最初是作为一个独立项目开发的&…