golang文档(golang wmi)

本篇文章给大家谈谈golang文档,以及golang wmi对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Golang常用包有哪些

⑴ Go Kit

它本身不是一个框架,而是一套微服务工具集,可以用于解决分布式系统开发中的大多数常见问题,所以使用者可以专注于你的业务逻辑中。

⑵ Gingko

是一个Go测试框架,目的是帮助我们使用行为驱动开发风格高效地编写富有表现力和全面的测试,它有着非常良好的帮助文档,任何人都可以轻松地在项目中集成使用它。

⑶ NSQ

实时分布式消息传递平台,提供高可用性和可靠的消息传递保证,可以水平扩展,支持负载均衡,安装部署非常方便。

⑷ Goose

Golang中最佳的数据库迁移包,通过创建增量SQL更改和Go函数来管理数据库结构,在Go1.16版本以上,还支持了嵌入式sql迁移。

⑸ GORM

是一个功能齐全的Golang对象关系映射库,是一种开发人员友好的工具,用于在不兼容的类型系统之间转换数据,专门设计用于在类型系统之间切换时最大限度地减少重写代码。

⑹ Authboss

一个模块化的身份验证包,使用它你可以快速地在项目中进行身份验证管理。它有几个常见的册蠢身份验证和授权模块供开发人员选择。

⑺ cli

是一个简单快捷的命令行管理包,用于为Go语言构建命令行应用程序,允嫌如许开发人员开发自己的富有表现力的命令行应用程序,用于创建标志、bash完成例程并生成帮助文本。

⑻ Vegeta

是一个用于HTTP负载测试的工具包,这个多功能工具专为测试具有恒定请求率的HTTP服务而设计。它可以有效地分析程序中的潜州者陪在问题,是一个始终贯穿以提高整体性能为目的的包。

golang html文件转pdf

可以使用虚拟打印机来处理:

方法一:使用虚拟打印机pdf factory即可,而且其他格式文件只要是能够打印,选择这个虚拟打印机,都可以做成PDF文件,很简单实用;

最简单而且实用的使用虚拟打印机pdf factory即可,可以把任意只要能够打印的格式文件都可以做成PDF文件,并且可以把多个文件通过打印之后合成一个PDF文件。

pdfFactory Pro(虚拟打印机)是一个无须 Acrobat 创建 Adobe PDF 文件的打印机驱动程序。pdfFactory Pro(虚拟打印机)提供的创建 PDF 文件的方法比做销并其他方法更方便和高效。 功能包括: 多个文档整合到一个 PDF 文件中; 内嵌字体; 通过 E-mail 发送; 预览; 自动压缩优化。

PDF Factory是pdf虚拟打印机软件,下载安装好PDF Factory后,在打斗岁印机控制面板中就可以找到一台由pdf Factory虚拟出来的打印机,可以把任何可以打印的文件转换成pdf文件。用任何可以支持打印输出的软件,把需要处理的文件逐个打印到这个虚拟打印机,全部打印完成后可把结果保存成一个pdf文件。甚至可以把不同软件格式的文件,如word、excel、photoshop等任何可以支持打印的文件,打印到同一个pdf文件。

在打印之前,在PDF Factory Pro里面设置一下PDF的打开、打印等权限即可实现加密等目的;

在打印之前,在设置里面,就把加载所有的系统字体选中。

在打印界面出来后,可以在左侧设置水印。然后再保存PDF文件。

打印完毕后,下载一纯迹个Adobe Reader,然后安装,可以很流畅的阅读PDF文件。

方法二:用其他虚拟打印机转成PDF文件。

方法三:使用专门的转换软件,把文件转成PDF文件。

[img]

golang elasticsearch 文档操作(CRUD) --- 2022-04-02

本节主要介绍纤逗蠢go语言对Elasticsearch文档的基础操作:创建、查询、更新、删除。

为了方便演示文档的CRUD操作,我们先定义索引的struct结构

根据文毁陪档ID,查询文档

通过多个Id批量查询文档,对应ES的multi get

根据id更新文档

支持批量更新文档内容

提示: 复杂查询条件,请参考 go es查询用指缓法

【golang详解】go语言GMP(GPM)原理和调度

Goroutine调度是一个很复杂的机制,下面尝试用简单的语言描述一下Goroutine调度机制,想要对其有更深入的了解可以去研读一下源码。

首先介绍一下GMP什么意思:

G ----------- goroutine: 即Go协程,每个go关键字都会创建一个协程。

M ---------- thread内核级线程,所有的G都要放在M上才能运行。

P ----------- processor处理器,调度G到M上,其维护了一个队列,存储了所有需要它来调度的G。

Goroutine 调度器P和 OS 调度器是通过 M 结合起来的,每个 M 都代表了 1 个内核线程,OS 调度器负责把内核线程分配到 CPU 的核上执行

模型图:

避免频繁的创建、销毁线程,而是对线程的复用。

1)work stealing机制

  当本线程无可运行的G时,尝试从其他线程绑定的P偷取G,而不是销毁线程。

2)hand off机制

  当本线程M0因为G0进行系统调用阻塞时,线程释放绑定的P,把P转移给其他空闲的线程执行。进而某个空闲的M1获取P,继续执行P队列中剩下的G。而M0由于陷入系统调用而进被阻塞,M1接替M0的工作,只要P不空闲,就可以保证充分利用CPU。M1的来源有可能是M的缓存池,也可能是新建的。当G0系统调用结束后,根据M0是否能获取到P,将会将G0做不同的处理:

如果有空闲的P,则获取一个P,继续执行G0。

如果没有空闲的P,则将G0放入全局队列,等待被其他的P调度。然后M0将进入缓存池睡眠。

如下图

GOMAXPROCS设置P的数量,最多有GOMAXPROCS个线程分布在多个CPU上同时运行

在Go中一个goroutine最多占用CPU 10ms,防止其他goroutine被饿死。

具体可以去看另一篇文章

【Golang详解】go语言调度机制 抢占式调度

当创建一个新的G之后优先加入本乎团配地队列,如果本地队列满了,会将本地队列的G移动到全局队列里面,当M执行work stealing从其他P偷不到G时,它可以从全局G队列获取G。

协程经历过程

我们创建一个协程 go func()经历过程如下图:

说明:

这里有两个存储G的队列,一个是局部调度器P的本地队列、一个是全局G队列。新创建的G会先保存在P的本地队列中,如果P的本地队列已经满了就会保存在全局的队列中;处理器本地队列是一个使用数组构成的环形链表,它最多可以存储 256 个待执行任务。

G只能运行在M中,一个M必须持有一个P,M与P是1:1的关系。M会从P的本地队列弹出一个可执行状态的G来执行,如果P的本地队列为空,就会想其他的MP组合偷取一个可执行的G来执行;

一个M调度G执行的过程是一个循环机制;会一直从本地队列或全局队列中获取G

上面说到P的个数默认等于CPU核数,每个M必须持有一个P才可以执行G,一般情况下M的个数会略大于P的个数,这多出来的M将会在G产生系统调用时发挥作用岁指。类似线程池,Go也提供一个M的池子,需要时从池子中或塌获取,用完放回池子,不够用时就再创建一个。

work-stealing调度算法:当M执行完了当前P的本地队列队列里的所有G后,P也不会就这么在那躺尸啥都不干,它会先尝试从全局队列队列寻找G来执行,如果全局队列为空,它会随机挑选另外一个P,从它的队列里中拿走一半的G到自己的队列中执行。

如果一切正常,调度器会以上述的那种方式顺畅地运行,但这个世界没这么美好,总有意外发生,以下分析goroutine在两种例外情况下的行为。

Go runtime会在下面的goroutine被阻塞的情况下运行另外一个goroutine:

用户态阻塞/唤醒

当goroutine因为channel操作或者network I/O而阻塞时(实际上golang已经用netpoller实现了goroutine网络I/O阻塞不会导致M被阻塞,仅阻塞G,这里仅仅是举个栗子),对应的G会被放置到某个wait队列(如channel的waitq),该G的状态由_Gruning变为_Gwaitting,而M会跳过该G尝试获取并执行下一个G,如果此时没有可运行的G供M运行,那么M将解绑P,并进入sleep状态;当阻塞的G被另一端的G2唤醒时(比如channel的可读/写通知),G被标记为,尝试加入G2所在P的runnext(runnext是线程下一个需要执行的 Goroutine。), 然后再是P的本地队列和全局队列。

系统调用阻塞

当M执行某一个G时候如果发生了阻塞操作,M会阻塞,如果当前有一些G在执行,调度器会把这个线程M从P中摘除,然后再创建一个新的操作系统的线程(如果有空闲的线程可用就复用空闲线程)来服务于这个P。当M系统调用结束时候,这个G会尝试获取一个空闲的P执行,并放入到这个P的本地队列。如果获取不到P,那么这个线程M变成休眠状态, 加入到空闲线程中,然后这个G会被放入全局队列中。

队列轮转

可见每个P维护着一个包含G的队列,不考虑G进入系统调用或IO操作的情况下,P周期性的将G调度到M中执行,执行一小段时间,将上下文保存下来,然后将G放到队列尾部,然后从队列中重新取出一个G进行调度。

除了每个P维护的G队列以外,还有一个全局的队列,每个P会周期性地查看全局队列中是否有G待运行并将其调度到M中执行,全局队列中G的来源,主要有从系统调用中恢复的G。之所以P会周期性地查看全局队列,也是为了防止全局队列中的G被饿死。

除了每个P维护的G队列以外,还有一个全局的队列,每个P会周期性地查看全局队列中是否有G待运行并将其调度到M中执行,全局队列中G的来源,主要有从系统调用中恢复的G。之所以P会周期性地查看全局队列,也是为了防止全局队列中的G被饿死。

M0

M0是启动程序后的编号为0的主线程,这个M对应的实例会在全局变量rutime.m0中,不需要在heap上分配,M0负责执行初始化操作和启动第一个G,在之后M0就和其他的M一样了

G0

G0是每次启动一个M都会第一个创建的goroutine,G0仅用于负责调度G,G0不指向任何可执行的函数,每个M都会有一个自己的G0,在调度或系统调用时会使用G0的栈空间,全局变量的G0是M0的G0

一个G由于调度被中断,此后如何恢复?

中断的时候将寄存器里的栈信息,保存到自己的G对象里面。当再次轮到自己执行时,将自己保存的栈信息复制到寄存器里面,这样就接着上次之后运行了。

我这里只是根据自己的理解进行了简单的介绍,想要详细了解有关GMP的底层原理可以去看Go调度器 G-P-M 模型的设计者的文档或直接看源码

参考: ()

()

关于golang文档和golang wmi的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表