用go语言写一个并发的快速排序

随风

快速排序,相信学过算法的各位大佬一定是再熟悉不过了。快速排序以其出色的性能,以及无需辅助空间,较容易实现而获得了极为广泛的使用。但随着CPU核数的日益增加,如何充分利用多核性能已经成为提高程序性能的又一大重要议题,因而在继续讨论iris框架的时候,我想先讨论一下go语言的杀手锏——并发编程。go语言对并发的原生支持,使其对于多核心利用极为有效。

在讨论并发编程之前,我们先来看看几个概念——进程,线程,协程。进程应该是我们最熟悉的。进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。由于进程需要分配系统资源,如内存之类的,故利用多进程来实现高并发显然是捉襟见肘,极为不实际。就在我们困厄的时候,线程应运而生,通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源,在引入线程操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。当下推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。许多编程语言对线程的支持都很不错,如java。java有大量的线程操作库,如thread,继承之后重写run方法即可轻松启动一个线程。线程看似轻量,无往而不利,对提高并发量有着极为重要的作用。但它在面对秒杀等场景的时候,线程的缺陷也暴露出来,它始终是一个调度的基本单位,因而能够支持并发的数量也不会太高,普通的个人电脑难以实现百万线程,这时侯协程就应运而生。

协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。可见协程更加轻量,能够实现更高的并发。go语言的groutine正是利用了协程来实现。

那么协程之间如何通讯呢,不能通讯的协程其作用就大大削弱,go语言别出心裁的采用了Chanel实现,其实是一个阻塞队列,当然也可以是带有缓冲的非阻塞的,后面文章会详细讨论。

有了以上的基础知识,不难写出并发快排的代码

import “sync”

func MutiQuickSort(num []int){

lock.Add(1)

QuickSort(num, 0, len(num)-1)

lock.Wait()

}

var lock sync.WaitGroup

func QuickSort(num []int, low, high int) {

defer lock.Done()

if low >= high {

return }

i, j := low, high

key := num[low]

for i < j {

for j > i && num[j] >= key {

j } num[i] = num[j]

for i < j && num[i] < key {

i++ }

num[j] = num[i]

}

num[j] = key lock.Add(2)

go QuickSort(num, low, i-1)

go QuickSort(num, i+1, high)

}

可见用go语言处理并发优雅而方便,不愧为21世纪c语言。

部分来自百度百科,csdn

宇宙最快之go web框架——iris

随风

昨天兴致大发写了一篇go语言的文章,看到不少朋友对go语言还是很感兴趣的。今天兴致大发,决定再写一篇关于go web开发的文章。今天我想介绍的是宇宙最快之go web框架——iris。是不是有点夸张?我本人觉得确实有点夸张,不过iris框架的官方GitHub文档是这么写的,我也就不好反驳了,实际上iris框架的性能确实比spring boot高出很多,而且能满足树莓派等设备需求,轻量简洁,这大概也是go语言的特点吧。

做过后端的各位朋友肯定都知道,重造轮子是一件非常麻烦的事。我们固然可以从socket开始写起,但是这样的开发效率肯定是。。。(不用多说。。)其实java真正厉害的也许不是语言本身,而是附着在java上的众多框架,例如spring。有了这些脚手架,我们就可以站在前人的肩膀上走得更远。

iris的安装很容易,只需要go get -u github.com/kataras/iris,当然前提条件是安装了go编译器,如果不懂安装而对go语言感兴趣的话,也可以私信创万联公众号哦。

先来一段iris框架使用的简单demo

package main

import (
“github.com/kataras/iris”
“github.com/kataras/iris/context”
)

func main() {
app := iris.New()
app.Get(“/”, func(ctx context.Context){

ctx.HTML(“<h1>Welcome</h1>”)

})
app.Run(iris.Addr(“:8080”))
}

将其复制后保存到记事本,然后命名为main.go,打开命令行。go build main.go,打开浏览器输入127.0.0.1:8080/即可以看到welcome显示在浏览器上。是不是感觉很简单,很想尝试一下,那就赶快动手试试吧。

事实上iris为我们包装了路由处理以及完整的mvc框架支持,以及令人兴奋的中间件处理,考试要紧,今天我们就聊到这吧,下期再见。

go语言,未来的新选择

随风

做了一段时间的后端,有苦也有喜悦。在创万联的实战之中使我认识了一种全新的,令人喜悦而又忧虑的新语言——go语言。

go语言的哲学是少即是多。这是go的信条,这与java严密的逻辑体系有所不同。go语言没有泛型,没有类层次,在现代语言中显得有点特立独行。go语言奉行独特的组合思想,你走起来是鸭子你就是鸭子的思想使得go语言具有了独特的灵活。

go语言天生高并发,go语言创建一个协程极度简单。只需要go 函数即可。在多核心时代,这种设计无疑给编程人员带来了很大的方便。利用Chanel 进行消息传递避开了传统多线程互斥锁等操作,尽管不能完全消除,但至少使得高并发编程更加优雅。

go的面向对象编程其实是容易的,它使得类的神秘性不再存在,this指针被暴露眼前,多态虚函数等晦涩概念也无需深究。

当然go的缺点也显而易见,go的生态相对于java是那么的缺乏,以至于构建后端很多时候不得不重造轮子。但相信以后或许这种情况会得到改善,使得我们在写后端时候多一种选择。

室内定位专题(小白也能看得懂)

你清楚自己的定位吗?

新开栏目,创万联的科普环节。

本栏目计划用四期的时间,给大家科普目前主流的室内定位系统。

要了解各种室内定位系统,我们必须知道定位系统的构成, 定位系统由两个部分组成:包括数据的收集方式(主要是传输信息的形式如:Wi-Fi技术,UWB,可见光等)和数据的处理(算法,如:TOA TDOA AOA RSSI算法)

在这一期当中,我们先简单了解一下算法。

室内定位算法——几何法(包括TOA TDOA AOA 等)

TOA(Time of Arrival到达时间定位法)

TOA定位方法就是利用信号传输的所需时间,将各锚节点到标签所需的传播时间分别乘以光速,从而计算出各个锚节点到标签之间的距离。在二维平面内通常需要至少三个或以上的锚节点基站,分别利用其到标签的距离大小,利用几何关系即可计算出一个精确的坐标。(而在三维空间中则需要四个或以上的锚点,通过相同的原理也可以求出标签的坐标。)

TOA定位技术——二维平面定位原理

但是,这种方法在实际使用当中存在很严重的问题——时间同步问题。

由于TOA定位方法是依赖于标签和锚节点的时间差,进而计算出两点距离的,因而假使标签和锚节点的基准时间不一致,细小的时间误差将会造成十分严重的位置误差。

那如何解决这一问题呢?唯一的办法就是使标签和锚节点时间同步,但是标签上的时间为用户所自带的时间,受到实际环境的影响想要两者时间完全同步很难实现。

既然不能解决问题,那为什么不试着避开问题呢?于是,一项无需标签和锚节点严格时间同步的算法就诞生了——TDOA算法(到达时间差算法)。

TDOA算法(Time Difference of Arrival到达时间差算法)

相比于按照直接计算出各锚点到标签的距离作圆求出坐标,TDOA算法要求利用出标签到达各节点的时间之差,求出距离差,在任意两个锚节点中只要知道其到标签的距离差即可做出一条双曲线,在二维平面内只需要三个锚节点即可求得两条双曲线知道标签的坐标。

                         TDOA定位技术——二维平面定位原理

利用这种算法,虽然标签和锚节点的时间不同步,不能求出准确的距离,但是求出的距离差确是一个确切的值,因而求出的坐标也是一个准却的点。在这种算法当中,只要要求各锚节点的基准时间同步,无需标签和锚节点时间同步,这种算法的要求比TOA算法更加低,实现“各锚点时间同步”的难度相比于“标签和锚节点同时同步”更低,定位坐标精度更加高。

                        标签-锚节点时间不同步的定位效果

以上两种方法都是利用距离,根据几何关系直接求出坐标点。然而,在实际的应用当中还会遇到多径效应干扰,非视距误差的问题。目前解决这两种误差的比较新的方法是利用CHAN算法计算出TDOA的标签初始位置的估计值,利用高斯牛顿迭代法GN对初始位置进行寻优迭代,利用基站计算加权矩阵W,从而得出更新位置与原位置的差值,用这个差值和迭代门限进行比较,在满足一定的迭代门限后就可以得到一个较优的解。(聂睿等,2020)

但是,无论是TOA还是TDOA都需要各锚节点的时间严格同步,为了彻底避免时间的同步问题,直接利用角度计算的算法(AoA算法和AOD算法)便应运而生。

AoA定位算法(Angle of Arrival到达角交汇定位法

AoA技术以接收器和发射器为基础,通过接收器计算出发射器所发射电波的到达角度,又因为接收器都有确定的位置,在二维平面内只需要两个确定的到达角度就可以得到发射器所在坐标。(如图:在确定的两个接收器下,通过计算发射器发射电波的到达角度,可以得到发射器的坐标

二维平面内AoA定位方法

但是,我们都知道发射器所发射的电波是没有方向性的,即电波是往四周广播扩散的。然而接收器却需要判断出发射器的来源角度,那么这一过程是如何实现的呢?(以蓝牙5.1角度定位为例子)

在二维平面内,以一个具备多天线线性数组的设备作为接收器,另取一个不断向外广播的单天线设备作为发射器,发射器以正弦波的形式向四周发送电波。当电波到达接收器时,由于发射器上不同的天线接收到的信号是不同步的,每个天线接收到的信号函数波形相同,但是这些信号函数波形都存在着相位差,而正是利用这些相位差,即可估算出电波的到达角度。[2](如图,每个天线同一时间内,接收的图形相同但有相对位移,利用相位差求得到达角度)

                              AoA角度定位原理

(PS:通常情况下,相邻天线的距离不能超过半个波长。采用2.4GHz的发射频率时,对应的波长为0.125m)

AoD定位算法(出发角交汇定位法)

同样是利用相位差计算角度的计算原理,与AoA不同的时,AoD定位算法要求发射器具有多天线,接收器为单天线,从原来的接收器利用多天线分析,转变成单天线分析多天线的发射特征,尽管应用原理相同,但是AoD与AoA分别适用于不同的解决方案。

AoA测向方法适用于RTLS,项目查找和PoI信息定位服务解决方案。

AoD测向方法适用于IPS解决方案,例如用于寻路,导航。[3]

我们将继续讲解室内定位算法当中的RSSI算法(信号强度定位法)

如果喜欢本栏目,可以关注我们的公众号,获得更多有趣的知识。

参考文献:

[1]聂睿.一种基于UWB定位的误差抑制TDOA算法研究[C].海南大学,2020.

[2]RF_star.AoA/AoD技术应用于蓝牙室内定位

https://blog.csdn.net/RF_star/article/details/98862360.2020.10.3

[3] beautifulzzzz .[蓝牙前沿应用] 照明即平台 —— 通过蓝牙增强服务提高照明投资回报率(蓝牙MESH、定位AoA、AoD).https://www.cnblogs.com/zjutlitao/p/10604840.html.

2020.10.4.

如何创建自己的网站专题1

随着互联网的发展越来越多的人开始尝试自己建设私人网站,私人网站给我们带来的好处之多,在这里我就不一一细谈,相信阅读本博客的人也应该对私人网站有所了解,因此下面我就直接开始谈论如何建设自己的网站。

建设自己的网站前,我们要清楚我们希望自己的网站将来需要什么功能,是否需要交互,如果仅仅只是展示,那么我们需要的知识就相对较少。同时你必须明确自己是否有创客精神,因为这决定了你截然不同的技术路线。

下面来谈谈最简单的建站方式,专业网站代理建设。

这只是一个例子,不代表创万联立场。

这种方式建站十分简单,完全不需要任何技术学习,但是这种方式对于创客或者有更多需求的人来说缺点也十分明显,无法实现更复杂的交互,运营价格比较高(除了免费版)。如果你希望拥有更多的diy空间,那么这种方式不适合你。

 那么有没有更高级的方法呢,当然有了。ecs云主机和个人网站空间都是极好的选择,但这两者也有很大区别,学习成本也不同。

这只是一个例子,不代表创万联立场。

个人网页空间价格较低,有较高的建站自由度,但是对于diy人士而言,其能力局限于建站显然是大多数创客所不能忍受的。选购网站空间尽量选择大品牌的而且有php功能的,否则绚丽的后台世界是难以完成的。选择网站空间一般同时配套有域名,有些还可以免备案,关于如何备案以及相关具体操作在后续系列文章会有详细解析。

        好了,这期文章我们总共介绍了两种建站方式,下期我们将专门介绍ecs云主机建站,这是目前自由度最高的经济实惠的个人建站方式,感谢大家阅读,我们下期再见。我们的公众号创万联也会有同步专题,欢迎阅读并讨论。