libgo 是一个使用 C++ 编写的协作式调度的stackful协程库, 同时也是一个强大的并行编程库。
设计之初是为高并发分布式Linux服务端程序开发提供底层框架支持,可以让链接进程序的同步的第三方库变为异步库,不影响逻辑的前提下提升其性能。
目前支持两个平台:
Linux (GCC 4.8+)
Windows (Win7、Win8、Win10 x86 and x64 使用VS2013/2015编译)
使用libgo编写并行程序,即可以像golang一样开发迅速且逻辑简洁,又有C++原生的性能优势。
1.提供golang一般功能强大协程,基于corontine编写代码,可以以同步的方式编写简单的代码,同时获得异步的性能
2.支持海量协程, 创建100万个协程只需使用2GB内存
3.允许用户自由控制协程调度点,随时随地变更调度线程数;
4.支持多线程调度协程,极易编写并行代码,高效的并行调度算法,可以有效利用多个CPU核心
5.可以让链接进程序的同步的第三方库变为异步调用,大大提升其性能。再也不用担心某些DB官方不提供异步driver了,比如hiredis、mysqlclient这种客户端驱动可以直接使用,并且可以得到不输于异步driver的性能。
6.动态链接和静态链接全都支持,便于使用C++11的用户静态链接生成可执行文件并部署至低版本的linux系统上。
7.提供协程锁(co_mutex), 定时器, channel等特性, 帮助用户更加容易地编写程序.
8.网络性能强劲,在Linux系统上超越ASIO异步模型;尤其在处理小包和多线程并行方面非常强大
在源码的samples目录下有很多示例代码,内含详细的使用说明,让用户可以很轻易地学会使用libgo。
#include <stdio.h> #include <libgo/coroutine.h> co_main(int argc, char **argv) { go []{ printf("1\n"); co_yield; printf("2\n"); }; go []{ printf("3\n"); co_yield; printf("4\n"); }; return 0; }
Windows libgo 使用 下载 cmake ,并安装(我下载 的 Windows win32-x86 Installer: Installer tool has changed. Uninstall CMake 3.4 or lower first!) 编译 clone git clone https://github.com/yyzybb537/libgo.git CMake编译参数 禁
Windows libgo 使用 参考 github libgo 下载 cmake ,并安装(我下载 的 Windows win32-x86 Installer: Installer tool has changed. Uninstall CMake 3.4 or lower first!) 编译 clone git clone https://github.com/yyzybb537/libgo
时至2018年的今天,C++ 在互联网服务端开发方向依然占据着相当大的份额;百度,腾讯,甚至以java为主流开发语言的阿里都在大规模使用C++做互联网服务端开发,而这恰恰是本文想要讨论的范畴。 第1章 C++协程近况简介 协程分两种,无栈协程(stackless)和有栈协程(stackful),前者无法解决异步回调模式中上下文保存与恢复的问题,在此不做论述,文中后续提到的协程均指有栈协程。 第1节
项目中在运行golang编译出来的可执行程序时,出现了以下错误: root [ ~ ]# /mnt/main_test /mnt/main_test: error while loading shared libraries: libgo.so.19: cannot open shared object file: No such file or directory 一开始以为是个很小、很容易解决
1.下载 建议到 https://github.com/yyzybb537/libgo/tags 下载稳定版。 本人下载了master分支的最新代码,编译报错: macro "__has_attribute" requires an identifier 304 | #if __GNUC_PREREQ (2,5) || __glibc_has_attribute (__const__) 2.安
fensnote/libgo https://gitee.com/fensnote/libgo Libgo is a stackful coroutine library for collaborative scheduling written in C++ 11, and it is also a powerful and easy-to-use parallel programming lib
与子程序(或者说函数)一样,协程(coroutine)也是一种程序组件。Donald Knuth 曾说,子程序是协程的特例。 一个子程序就是一次函数调用,它只有一个入口,一次返回,调用顺序是明确的。但协程的调用和子程序则大不一样,协程允许有多个入口对程序进行中断、继续执行等操作。 Python2 可以通过 yield 来实现基本的协程,但不够强大,第三方库 gevent 对协程提供了强大的支持。另
Tornado 中推荐用 协程 来编写异步代码. 协程使用 Python 中的关键字 yield 来替代链式回调来实现挂起和继续程序的执行(像在 gevent 中使用的轻量级线程合作的方法有时也称作协程, 但是在 Tornado 中所有协程使用异步函数来实现的明确的上下文切换). 协程和异步编程的代码一样简单, 而且不用浪费额外的线程, . 它们还可以减少上下文切换 让并发更简单 . Exampl
defer 协程客户端的对象结构体,设置client->defer = 1表示启用了defer延迟收包 设置client->defer_yield = 1表示进入了wait状态 事件监听 因为swoole底层的EventLoop总是在运行的,因此可能某个协程客户端没有yield也会收到包。底层需要对数据进行缓存。 Client 自动保存到ccp->result内存中。为了避免收到的数据过多,导致内
概念 Hyperf 是运行于 Swoole 4 的协程之上的,这也是 Hyperf 能提供高性能的其中一个很大的因素。 PHP-FPM 的运作模式 在聊协程是什么之前,我们先聊聊传统 PHP-FPM 架构的运作模式,PHP-FPM 是一个多进程的 FastCGI 管理程序,是绝大多数 PHP 应用所使用的运行模式。假设我们使用 Nginx 提供 HTTP 服务(Apache 同理),所有客户端发起
Python的协程很像生成器,但并不是生成数据,大多数时候扮演了数据消费者的作用。换句话说,协程是一个在每次使用send方法发送数据后就会被唤醒的函数。 协程的要点是将“yield”关键字写在表达式的右边。下面是一个打印出所发送的值的协程例子: def coroutine(): print('My coroutine') while True: val = yiel
就一个简单实现的语言来说,如果有并发需求,像之前说的直接使用宿主环境的线程,加上必要的调度控制即可实现需求,但如果要求比较高,触发到上篇讲的线程和单线程异步的相关缺陷,一个较普遍的解决办法是采用用户态并发,即对于os内核来说,进程只有一个或少数几个线程,而对于源语言来说,接口和使用线程别无二致,由虚拟机实现对这些“线程”的调度,虚拟机的实现则可以一定程度简化、优化调度算法和内存占用,从而达到高并发
协程,又称微线程,纤程。英文名Coroutine。 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。 所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。 子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和
在学习异步IO模型前,我们先来了解协程。 协程,又称微线程,纤程。英文名Coroutine。 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。 所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。 子程序调用总是一个入口,