libgo是一个使用C++11编写的协作式调度的stackful协程库,

同时也是一个强大的并行编程库, 是专为Linux服务端程序开发设计的底层框架。

目前支持三个平台:

Linux (GCC4.8+)

Windows (Win7、Win8、Win10 x86 and x64 使用VS2013/2015编译)

Mac (在mac分支上, 感谢群友 @eagle518 的贡献)

使用libgo编写并行程序,即可以像golang、erlang这些并发语言一样开发迅速且逻辑简洁,又有C++原生的性能优势,鱼和熊掌从此可以兼得。

libgo有以下特点:

1.提供golang一般功能强大协程,基于corontine编写代码,可以以同步的方式编写简单的代码,同时获得异步的性能,

2.支持海量协程, 创建100万个协程只需使用2GB物理内存

3.允许用户自由控制协程调度点,随时随地变更调度线程数;

4.支持多线程调度协程,极易编写并行代码,高效的并行调度算法,可以有效利用多个CPU核心

5.可以让链接进程序的同步的第三方库变为异步调用,大大提升其性能。再也不用担心某些DB官方不提供异步driver了,比如hiredis、mysqlclient这种客户端驱动可以直接使用,并且可以得到不输于异步driver的性能。

6.动态链接和静态链接全都支持,便于使用C++11的用户静态链接生成可执行文件并部署至低版本的linux系统上。

7.提供协程锁(co_mutex), 定时器, channel等特性, 帮助用户更加容易地编写程序.

8.网络性能强劲,超越boost.asio异步模型;尤其在处理小包和多线程并行方面非常强大。

如果你发现了任何bug、有好的建议、或使用上有不明之处,可以提交到issue,也可以直接联系作者: email: 289633152@qq.com QQ交流群: 296561497

tutorial目录下有很多教程代码,内含详细的使用说明,让用户可以循序渐进的学习libgo库的使用方法。

libgo的编译与使用:

Linux:

0.CMake编译参数  ENABLE_BOOST_CONTEXT  `这是在linux上性能最佳的编译参数`

libgo在Linux系统上默认使用ucontext做协程上下文切换,开启此选项将使用boost.context来替代ucontext.

使用方式:

  $ cmake .. -DENABLE_BOOST_CONTEXT=ON  ENABLE_BOOST_COROUTINE

libgo在Linux系统上默认使用ucontext做协程上下文切换,开启此选项将使用boost.coroutine来替代ucontext.

使用方式:

  $ cmake .. -DENABLE_BOOST_COROUTINE=ON  DISABLE_HOOK

禁止hook syscall,开启此选项后,网络io相关的syscall将恢复系统默认的行为,

协程中使用阻塞式网络io将可能真正阻塞线程,如无特殊需求请勿开启此选项.

使用方式:

  $ cmake .. -DDISABLE_HOOK=ON

不开启ENABLE_BOOST_CONTEXT和ENABLE_BOOST_COROUTINE选项时, libgo不依赖boost库,可以直接使用,仅测试代码依赖boost库。

1.如果你安装了ucorf或libgonet,那么你已经使用默认的方式安装过libgo了,如果不想设置如上的选项,可以跳过第2步.

2.使用CMake进行编译安装:

  $ mkdir build  $ cd build  $ cmake ..  $ sudo make install

如果希望编译可调试的版本, "cmake .." 命令执行完毕后执行:

  $ make debug  $ sudo make install

执行单元测试代码:

  $ make test  $ make run_test

生成性能网络测试代码:

  $ make bm

3.以动态链接的方式使用时,一定要最先链接liblibgo.so,还需要链接libdl.so. 例如:

  g++ -std=c++11 test.cpp -llibgo -ldl [-lother_libs]

4.以静态链接的方式使用时,只需链接liblibgo.a即可,不要求第一个被链接,但要求libc.a最后被链接. 要求安装GCC的静态链接库, debian系Linux安装gcc时已经自带, redhat系Linux需要从源中另行安装(yum install gcc-static) 例如:

  g++ -std=c++11 test.cpp -llibgo -static -static-libgcc -static-libstdc++

Windows:

0.CMake编译参数

  DISABLE_HOOK

禁止hook syscall,开启此选项后,网络io相关的syscall将恢复系统默认的行为,

协程中使用阻塞式网络io将可能真正阻塞线程,如无特殊需求请勿开启此选项.

使用方式:

  $ cmake .. -DDISABLE_HOOK=ON

1.使用git submodule update --init --recursive下载Hook子模块

2.使用CMake构建工程文件.

比如vs2015(x64):

  $ cmake .. -G"Visual Studio 14 2015 Win64"

比如vs2015(x86):

  $ cmake .. -G"Visual Studio 14 2015"

比如vs2013(x64):

  $ cmake .. -G"Visual Studio 12 2013 Win64"

3.使用时需要添加两个include目录:src和src/windows, 或将这两个目录下的头文件拷贝出来使用

4.如果想要执行测试代码, 需要依赖boost库. 且在cmake参数中设置BOOST_ROOT:

例如:

  $ cmake .. -G"Visual Studio 14 2015 Win64" -DBOOST_ROOT="e:boost_1_61_0"

注意事项(WARNING):

1.在开启WorkSteal算法的多线程调度模式下不要使用。因为协程的每次切换,下一次继续执行都可能处于其他线程中.

2.不要让一个代码段耗时过长。协程的调度是协作式调度,需要协程主动让出执行权,推荐在耗时很长的循环中插入一些yield

3.除网络IO、sleep以外的阻塞系统调用,会真正阻塞调度线程的运行,请使用co_await, 并启动几个线程去Run内置的线程池.

Linux系统上Hook的系统调用列表:

connect   read      readv     recv      recvfrom  recvmsg   write     writev    send      sendto    sendmsg   poll      select    accept    sleep     usleep    nanosleepgethostbyname                                                               gethostbyname2                                                              gethostbyname_r                                                             gethostbyname2_r                                                            gethostbyaddr                                                               gethostbyaddr_r

以上系统调用都是可能阻塞的系统调用, 在协程中使用均不再阻塞整个线程, 阻塞等待期间CPU可以切换到其他协程执行.

  close       fcntl       ioctl       getsockopt  setsockopt  dup         dup2        dup3      

以上系统调用不会造成阻塞, 虽然也被Hook, 但并不会完全改变其行为, 仅用于跟踪socket的选项和状态.

Windows系统上Hook的系统调用列表:

ioctlsocket                                                                        WSAIoctl                                                                           select                                                                             connect                                                                            WSAConnect                                                                         accept                                                                             WSAAccept                                                                          WSARecv                                                                            recv                                                                               recvfrom                                                                           WSARecvFrom                                                                        WSARecvMsg                                                                         WSASend                                                                            send                                                                               sendto                                                                             WSASendTo                                                                          WSASendMsg

cmake导入so库_libgo - 协程库、并行编程库相关推荐

  1. C++ 协程与网络编程

    协程 协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态.协程可以在运行期间的某个点上暂停执行,并在恢复运行时从暂停的点上继续执行.  协 ...

  2. python3异步编程_协程 Python异步编程(asyncio)

    协程(Coroutine) 也可以被称为微线程,是一种用户态内的上下文切换技术.简而言之,其实就是通过一个线程实现代码块相互切换执行. 直接上代码,例如: 同步编程 import time def f ...

  3. python协程和异步编程

    文章目录 协程 & 异步编程(asyncio) 1. 协程的实现 1.1 greenlet 1.2 yield 1.3 asyncio 1.4 async & awit 1.5 小结 ...

  4. python3协程 queue_使用gevent库+queue模块实现多协程爬虫,提高爬取效率!

    协程是干什么的? 协程可以提高任务执行的效率!它的执行原理就是当计算机在执行某个任务的时候,如果需要等待(比如爬取网站需要等待网站响应等),可以先去执行其他的任务,等等待结束(网站响应)时,再回来继续 ...

  5. Coil - Google推荐的协程图片加载库

    随着Kotlin的转正,Glide不再是最佳选择.看一下Google极力推荐的Coil框架. GitHub:Coilhttps://coil-kt.github.io/coil/ Pangu-Immo ...

  6. python 协程库_python --- 协程编程(第三方库gevent的使用)

    1. 什么是协程? 协程(coroutine),又称微线程.协程不是线程也不是进程,它的上下文关系切换不是由CPU控制,一个协程由当前任务切换到其他任务由当前任务来控制.一个线程可以包含多个协程,对于 ...

  7. 在C语言中实现协程库(一)----------协程切换原理详解

    从这篇文章开始,我将一点一点详细介绍如何在c语言中实现协程库.并对其中涉及到的技术进行详细的解释. 感兴趣的小伙伴欢迎一起参与 代码地址 协程切换原理 使用glibc中<ucontext.h&g ...

  8. python 协程库_python协程概念

    什么是协程 协程是单线程下的并发,又称微线程,纤程.它是实现多任务的另一种方式,只不过是比线程更小的执行单元.因为它自带CPU的上下文,这样只要在合适的时机,我们可以把一个协程切换到另一个协程.英文名 ...

  9. python 协程库_python 协程库gevent学习--gevent数据结构及实战(四)

    一不留神已经到第四部分了,这一部分继续总结数据结构和常用的gevent类,废话不多说继续. 1.Timeout错误类 晚上在调试调用第三方接口的时候,发现有些接口耗时非常多,觉得应该有个超时接口来限制 ...

最新文章

  1. as cast float server sql_SQL-Server(五)T-SQL语言
  2. 超图iClient 3D 入门程序 - 1
  3. power linux 安装系统,powershell 安装服务器
  4. 微信浏览器不支持下载文件或应用解决方案
  5. Solr:创建拼写检查器
  6. 文本溢出text-overflow和文本阴影text-shadow
  7. 快播王欣:区块链今天最重要的成果还只是理念布道
  8. SpringBoot学习笔记001--创建第一个spring boot应用
  9. ROW_NUMBER() OVER()函数用法详解
  10. mysql56 配置内存_【mysql】mysql 内存配置调优
  11. Java小游戏之飞翔的小鸟
  12. HDFView安装及使用教程
  13. 电阻阻值标准以及选择参照表
  14. 使用Bochs写Hello world
  15. Pillow图像处理
  16. 网上车市通过聆讯:营收单一,上半年减员15%,徐翀持股80%
  17. Exception thrown from ApplicationListener handling ContextClosedEvent
  18. 使用Java校验【统一社会信用代码】真假
  19. 【Debugger】解决springboot报错Failed to resolve org.junit.platform:junit-platform-launcher:1.x.x的两种解决方案
  20. toString转化成json

热门文章

  1. Tomcat其他方式启动
  2. 沸腾了!苏宁全员涨薪,每月最高多1万6!网友:这一刻,我希望我是苏宁人...
  3. JDK 13 的最新垃圾回收器ZGC,你了解多少?
  4. 堆排序 C++代码实现及思想 排序过程输出 恋上数据结构笔记
  5. Android踩坑日记:android7.0动态相机权限
  6. Eclipse中JSP默认模板修改:设置编码为UTF-8以及导入JSTL等
  7. java rect 旋转_处理(Java可视化语言):使用rectMode(CENTER)而不是rectMode(CORNER)旋转矩形,留下奇数衰落轨迹效果...
  8. 杭电1284钱币兑换问题—背包dp/母函数(java)
  9. XML简介及基本语法
  10. aix服务重启mysql_mysqld进程几分钟重启一次,如何解决?