协程池与新脚本语言

2024-01-07 13:20
文章标签 脚本语言 协程池

本文主要是介绍协程池与新脚本语言,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天的主人公名为——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");}finet.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还融合了响应式编程、运算符重载、反射、注入等等特色。

感谢您的阅读!

这篇关于协程池与新脚本语言的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/580056

相关文章

groovy动态脚本语言学习总结

就个人体会而言groovy是一门类似于scala的语言,集函数式与对象于一体的一门语言,从另外一个角度来看也可以说是在java基础上的封装,java能支持的操作,groovy基本都支持,毕竟groovy的运行环境也是jvm,其编译后的文件依然是.class后缀的文件,包括groovy的script编译后也是系统生成main函数去调用的,所以大部分跟java是一样的,是可以满足大部分java开发者顺

常见的数据库和脚本语言的搭配

1、LAMP: Linux+apache+PHP+MySQL 2、LNMP:Linux+Nginx+PHP+MySQL 3、Windows+IIS+.net+MSSql Server 4、Linux+Tomcat+JSP+MySQL 5、Linux+Tomcat+JSP+Oracle 6、asp+access 7、asp.net+MSSql   网站建设常用的数据库有ACCESS数

把C++当脚本语言写

把C++当脚本语言写!   提到脚本,脑海里马上闪过一大堆:Python,Perl,Ruby,PHP,JS,VBS,LUA。。。 不过你有没听说过,用经典的C++做脚本语言吗?先不多说,上个图。(先别纠结那个function,那仅仅是个宏而已,待会你就明白了)   或许你在想这一定是疯了,用世界上最复杂的语言做脚本,写的人累不说,脚本引擎先累坏了。各种复杂的模板库,要边解释边运行,得有多强大

linux下搭建lua脚本语言的编程环境

lua是脚本语言的一种,具体的该脚本的介绍可百度,本文介绍linux系统下搭建lua编程环境的步骤,以及在搭建过程中碰到的种种问题。 一、下载获取lua源码         地址http://www.lua.org/download.html             我下载到的是  lua-5.3.0.tar.gz  二、解压         解压命令:

简单剖析tRPC-Go中使用的第三方协程池ants

tRPC-Go中的tRPC.Go()方法使用了ants协程池,做个简单剖析 panjf2000/ants协程池 在tRPC.Go方法(异步启动goroutine)中看到里面使用了ants协程池去实现(具体位置:g.pool.Invoke(p)) 前置知识: 我们想异步完成一个任务,首先创建一个任务,然后需要从协程池(PoolWithFunc)中获取worker(goWorkerWithFu

lua脚本语言的学习-----------------lua栈操作

为了方便Lua与C交互,比如在C代码中调用Lua函数,Lua官方提供了一系列的API和库。利用这些API,C语言就可以方便从Lua中获取相应的值,也可以方便地把值返回给Lua,当然,这些操作都是通过栈作为桥梁来实现的。 lua中的栈跟汇编中的栈类似,都是由栈顶,栈底构成。 在lua_State中 TValue stack[max_stack_len] 就是定义的栈,以及最大的栈的大小。 执行

lua脚本语言的学习-----------------带参数的lua函数的传递

在使用lua的过程中,或许经常需要由lua来传递参数给c++,这时候就需要学习如何去获取到栈中的lua的参数了。 在栈中,使用获取参数的函数入下: lua_isnumber(); lua_ronumber(); 这都是double类型相关的函数,判读栈顶是否是数字,并且返回这个数字 下面来看下具体的例子吧。 通过lua传参实现一个简单的加法运算 // Lua_HelloWorld.c

lua脚本语言的学习-----------------如何实现c++无参数的函数在lua中调用

在c++和lua的交互过程中,经常会遇到lua中要调用c++里面的函数接口。那么如何去调用c++中的函数呢? 具体步骤如下: 1.定义c++函数接口 2.定义lua函数接口(必须以C风格导出) 3.注册lua函数 4.执行lua函数 这样就可以实现在lua中使用c++的函数了 具体使用的源码如下: // Lua_HelloWorld.cpp : 定义控制台应用程序的入口点。//#

22data 脚本语言基础——Python

横线为没讲到的。 1. 基础语法 变量:变量的声明和使用。 数据类型:整数(int)、浮点数(float)、字符串(str)、布尔值(bool)等。 运算符:算术运算符、比较运算符、逻辑运算符、赋值运算符等。 2. 控制结构 条件语句: if 、 elif 、 else 。循环: for  循环、 while  循环。 循环控制语句: break 、 continue 、 else 。 3. 数据

编译型语言、解释型语言、脚本语言的区别

计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。 把高级语言翻译成机器语言的两种方式:一种是编译,一种是解释。两种方式只是翻译的时间不通。 1.编译 编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因