开源C语言库Melon:多线程治理

这篇具有很好参考价值的文章主要介绍了开源C语言库Melon:多线程治理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

不知你是否有过类似如下的需求:

有一些功能,它们足够单一,但又需要后台持续运行,以容器实现感觉太重了,以进程实现又太琐碎了,以线程实现可以接受但是又不好管理。

这类程序诸如:数据采集程序、可观测性程序、中间件、代理等等。

这一需求乍看之下倒是有点类似supervisor在做的事情,每个功能一个单一后台进程。诚然进程是一个选择,但是实际使用中则会面临是大量的可执行程序和因人而异的开发风格。

当然,选择多线程还有另一个重要原因,这里先卖个关子,我们往下看。

解决方案

因此,笔者将介绍一个开源C语言库——Melon。
开源C语言库Melon:多线程治理,c语言,经验分享,程序人生,linux,学习,单片机,开源

它实现了一套多线程框架。在这套框架之下,每一个线程是一个独立的功能模块,并且可以接受来自主线程的管理。

关于 Melon 库,这是一个开源的 C 语言库,它具有:开箱即用、无第三方依赖、安装部署简单、中英文文档齐全等优势。

Github repo

对于上述的问题,我们可以使用这一框架来解决。除此之外,Melon还支持了另一个功能,这也是选择多线程的原因之一,谜底将在示例中揭晓。

示例

在Melon的多线程框架中,有两种方式可以启动不同的线程模块,下面的示例将以动态创建和杀掉线程的方式进行演示。

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include "mln_core.h"
#include "mln_log.h"
#include "mln_thread.h"
#include "mln_trace.h"

int sw = 0; //开关switch缩写
char name[] = "hello";
static void thread_create(mln_event_t *ev);

static int hello_entrance(int argc, char *argv[])
{
    printf("%s\n", __FUNCTION__);
    while (1) {
        mln_trace("s", "Hello");
        usleep(10);
    }
    return 0;
}

static void timer_handler(mln_event_t *ev, void *data)
{
    if (!sw) {
        mln_string_t alias = mln_string("hello");
        mln_thread_kill(&alias);
        mln_event_timer_set(ev, 1000, NULL, timer_handler);
    } else {
        thread_create(ev);
    }
    sw = !sw;
}

static void thread_create(mln_event_t *ev)
{
    char **argv = (char **)calloc(3, sizeof(char *));
    if (argv != NULL) {
        argv[0] = name;
        argv[1] = NULL;
        argv[2] = NULL;
        mln_thread_create(ev, "hello", THREAD_DEFAULT, hello_entrance, 1, argv);
        mln_event_timer_set(ev, 1000, NULL, timer_handler);
    }
}

int main(int argc, char *argv[])
{
    struct mln_core_attr cattr;

    cattr.argc = argc;
    cattr.argv = argv;
    cattr.global_init = NULL;
    cattr.main_thread = thread_create;
    cattr.worker_process = NULL;
    cattr.master_process = NULL;

    if (mln_core_init(&cattr) < 0) {
       fprintf(stderr, "Melon init failed.\n");
       return -1;
    }

    return 0;
}

可以看到,main函数中只初始化了Melon库。而多线程框架也正是在库初始化时启动的。

我们先对程序做大致的描述,然后给出Melon的配置文件内容。

整个程序流程大致如下:

  1. 初始化Melon库并运行多线程框架
  2. 调用thread_create函数对主线程做部分初始化操作,其中:
    1. 构建子线程入口参数的字符指针数组
    2. 调用mln_thread_create创建子线程hello
    3. 设置定时器事件timer_handler,这个函数将每秒钟被调用一次
  3. 子线程hello被拉起,并printf输出函数名后,进入死循环调用mln_trace函数(我们后面马上说到这个函数)
  4. 主线程每秒钟进入一次timer_handler并执行如下事项:
    1. 如果sw为0,则杀掉hello线程,并再次设置定时器事件
    2. 如果sw为1,则调用thread_create创建hello线程,并再次设置定时器事件
    3. 反转sw的值,保持每秒关闭和启动hello线程

我们可以看到,通过mln_thread_createmln_thread_kill我们可以让主线程动态的拉起和杀掉子线程。

为何使用多线程

因为我们使用了mln_trace,这个宏函数是将C代码中数据投递到脚本层。这么做的好处是,这些数据不需要被写入日志文件,然后再启动另一个程序处理日志文件。也不需要手写C代码来将这些数据发送给远端。脚本层有内置的库函数可以轻松完成这些数据的处理、传输、入库等操作。

配置

说了很多关于程序功能的问题,但想要正常启动这个程序还需要正确配置Melon,配置文件内容如下:

log_level "none";
//user "root";
daemon off;
core_file_size "unlimited";
//max_nofile 1024;
worker_proc 1;
thread_mode on;
framework "multithread";
log_path "/usr/local/melon/logs/melon.log";
trace_mode "trace/trace.m"; /* path or off */

这里主要关注三个配置:

  • framework必须是"multithread"
  • trace_mode如果想启用mln_trace的功能,这里要给出脚本代码路径,否则给出off表示关闭该功能
  • worker_proc是工作进程数,我们的多线程都是跑在工作进程上的,这样一旦线程有bug造成工作进程崩溃,主进程依旧可以拉起新的工作进程继续运行

脚本代码

本例的脚本代码使用的就是Melon库中自带的默认脚本trace/trace.m

/*
 * Copyright (C) Niklaus F.Schen.
 */
sys = Import('sys');
if (MASTER)
    sys.print('master process');
else
    sys.print('worker process');

Pipe('subscribe');
while (1) {
    ret = Pipe('recv');
    if (ret) {
        for (i = 0; i < sys.size(ret); ++i) {
            sys.print(ret[i]);
        }
    } fi
    sys.msleep(1000);
}
Pipe('unsubscribe');

脚本主要工作就是死循环调用Pipe函数接收mln_trace投递来的数据,并向终端输出。

运行结果

...
[Hello, ]
[Hello, ]
[Hello, ]
01/29/2023 07:38:23 GMT REPORT: PID:15708 Child thread 'hello' exit.
01/29/2023 07:38:23 GMT REPORT: PID:15708 child thread pthread_join's exit code: 1
hello_entrance
[Hello, ]
[Hello, ]
[Hello, ]
...

可以看到终端上会输出大量[Hello, ],这是脚本层输出的mln_trace投递来的数据。中间会穿插着一些线程退出和启动的打印信息。

感谢阅读!欢迎各位对Melon感兴趣的读者访问其Github仓库。文章来源地址https://www.toymoban.com/news/detail-780031.html

到了这里,关于开源C语言库Melon:多线程治理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 项目经验分享|openGauss 陈贤文:受益于开源,回馈于开源

    开源之夏 项目经验分享 2023 #08 #nbsp;关于 o penGauss nbsp;社区 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性。同时openGauss也是一个开源的数据库平台,鼓励社

    2024年02月08日
    浏览(36)
  • 一些实用Android的开源库,阿里架构师经验分享

    试想这么一个场景,在 A 页面打开 B 页面,然后 B 页面打开了 C 页面,C 页面又打开了 D 页面,而且还需要传递参数,在 D 页面修改了一些信息,然后这些信息更新之后,A、B、C 页面很可能都需要对应的进行数据更新,碰到这种需求该怎么处理? 有人说用 startActivityForResult

    2024年04月10日
    浏览(70)
  • 【程序人生】来自拥有 8 年经验的软件工程师的建议 | Advice From a Software Engineer With 8 Years of Experience

    目录 来自拥有 8 年经验的软件工程师的建议 | Advice From a Software Engineer With 8 Years of Experience Practical tips for those

    2024年02月05日
    浏览(47)
  • 开源网安受邀参加2023全球数字经济大会,分享软件安全落地实践经验

    近日, 2023全球数字经济大会数字安全生态建设专题论坛在京隆重举行 。作为2023全球数字经济大会的重要组成部分,本次论坛围绕“数字安全生态建设”这一主题,邀请政府主管部门、行业专家学者、关键信息基础设施运营主体、数字安全企业、数据要素流通等相关方参与交

    2024年02月12日
    浏览(47)
  • 一个基于.NET7的开源DNS服务 DnsServer 的部署使用经验分享

    接上篇 docker-bind 的使用搭建了一个 dns 服务,本篇将介绍另外一款 DnsServer 的部署和使用,更专注,更轻量。 基于 .NET 7 实现 ,支持 Windows、Linux、macOS 和 Raspberry Pi 开箱即用,使用简单,高性能 提供 Web 控制台,可视化管理,查看使用情况 提供了对网络的额外控制,允许阻止

    2024年02月05日
    浏览(36)
  • 【经验分享】自然语言处理技术有哪些局限性和挑战?

    个人认为,主要是两个难点: 1.语料,通常的语料很好解决,用爬虫从互联网上就可以采集和标注训练。但是我们接触很多项目和客户需求都是专业性很强的,例如:航天材料、电气设备、地理信息、化学试剂 等等。往往很多素材和语料都是很宝贵的,而且都是这些企业的内

    2024年02月21日
    浏览(38)
  • 视频批量剪辑矩阵分发系统源码开源分享----基于PHP语言

    批量剪辑视频矩阵分发: 短视频seo主要基于抖音短视频平台,为企业实现多账号管理,视频分发,视频批量剪辑,抖音小程序搭建,企业私域转化等,本文主要介绍短视频矩阵系统+抖音小程序开发详细及注意事项 技术部署开发研发账号矩阵系统的开发成本取决于许多因素,

    2024年02月10日
    浏览(37)
  • 论坛介绍 | COSCon'22 开源治理(G)

    COSCon\\\'22 开源社/KAIYUANSHE 业界最具影响力的开源年度盛会2022第七届中国开源年会(COSCon\\\'22)来啦!!! 本次年会将于10月29日-30日由开源社举办。线上共设有1个主论坛和16个分论坛,线下分会场遍布成都、深圳、上海、北京等11个城市。扫描下方二维码即可报名,快来参与吧~ 01

    2024年02月08日
    浏览(35)
  • 数据仓库内容分享(四):滴滴大数据成本治理实践

    目录 01 滴滴大数据成本治理总体框架 1. 滴滴数据体系 2. 滴滴大数据资产管理平台 3. 滴滴大数据成本治理总体框架 02 Hadoop 成本治理实践 03 ES 成本治理实践 04 一些心得 在介绍滴滴成本治理之前,首先来简单介绍一下滴滴的数据体系。 最底层是以数据引擎为基础的数据存

    2024年02月20日
    浏览(35)
  • 开源元数据治理平台Datahub部署指南(小白版)

    datahub是做什么的,这里就不展开描述了, 如果想了解更多请自行阅读DataHub官网文档, 这里主要教大家如何一步一步安装然后100%部署完成。一般开源产品的文档都是被大家吐槽的最多的,部署步骤写的非常简单,重要关键的配置有时候基本都是不提的,很多人想入门, 但是

    2024年02月03日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包