当前位置: 首页 > news >正文

上海建站网络科技怎样保证网站的安全

上海建站网络科技,怎样保证网站的安全,美容会所网站模板下载,wordpress 无法修改二、进阶使用 性能提升——协程 GoRoutine go f();一个 Go 线程上#xff0c;可以起多个协程#xff08;有独立的栈空间、共享程序堆空间、调度由用户控制#xff09;主线程是一个物理线程#xff0c;直接作用在 cpu 上的。是重量级的#xff0c;非常耗费 cpu 资源。协…二、进阶使用 性能提升——协程 GoRoutine go f();一个 Go 线程上可以起多个协程有独立的栈空间、共享程序堆空间、调度由用户控制主线程是一个物理线程直接作用在 cpu 上的。是重量级的非常耗费 cpu 资源。协程从主线程开启的是轻量级的线程是逻辑态。对资源消耗相对小。 CSP并发模型 Java、C、或者Python他们线程间通信都是通过共享内存的方式来进行的。非常典型的方式就是在访问共享数据例如数组、Map、或者某个结构体或对象的时候通过锁来访问 Go不要以共享内存的方式来通信相反要通过通信来共享内存 goroutine 是Go语言中并发的执行单位channel是Go语言中各个并发结构体(goroutine)之前的通信机制 底层原理——MPG模型 M指的是Machine代表OS线程。它是由OS管理的执行线程其工作方式与标准POSIX线程非常相似。在运行时代码中它被称为M for machine。 P代表着处理器(processor)它的主要用途就是用来执行goroutine的一个P代表执行一个go代码片段的基础(上下文环境)所以它也维护了一个可运行的goroutine队列和自由的goroutine队列里面存储了所有需要它来执行的goroutine。 G指的是Goroutine代表一个goroutine。它包括堆栈指令指针和其他对调度goroutine很重要的信息。 Seched代表着一个调度器它维护有存储空闲的M队列和空闲的P队列可运行的G队列自由的G队列全局runqueue以及调度器的一些状态信息等。 操作系统会在物理处理器上调度线程来运行而 Go 语言的运行时会在逻辑处理器上调度goroutine来运行。 p默认cpu内核数M与P的数量没有绝对关系一个M阻塞P就会去创建或者切换另一个M创建一个 goroutine 并准备运行这个 goroutine 就会被放到调度器的全局运行队列中。之后调度器就将这些队列中的 goroutine 分配给一个逻辑处理器并放到这个逻辑处理器对应的本地运行队列中本地运行队列中的 goroutine 会一直等待直到自己被分配的逻辑处理器执行。 当goroutine 需要执行一个阻塞的系统调用如打开一个文件线程和 goroutine 会从逻辑处理器上分离该线程会继续阻塞等待系统调用的返回。与此同时这个逻辑处理器就失去了用来运行的线程。所以调度器会创建一个新线程并将其绑定到该逻辑处理器上。之后调度器会从本地运行队列里选择另一个 goroutine 来运行。一旦被阻塞的系统调用执行完成并返回对应的 goroutine 会放回到本地运行队列而之前的线程会保存好以便之后可以继续使用。 go的协程是非抢占式的由协程主动交出控制权也就是说上面在发生IO操作时并不是调度器强制切换执行其他的协程而是当前协程交出了控制权调度器才去执行其他协程。我们列举一下goroutine可能切换的点动态获取信息——反射 反射可以在运行时动态获取变量的各种信息, 比如变量的类型(type)类别(kind)如果是结构体变量还可以获取到结构体本身的信息(包括结构体的字段、方法)通过反射可以修改变量的值可以调用关联的方法。 Type和ValueKind是一个大的分类比如定义了一个Person类它的Kind就是struct 而Type的名称是Person其中Value 为go值提供了反射接口。 package mainimport (fmtreflect )type Student struct {Name stringAge int }func test(i interface{}){//获取指针指向的真正的数值ValuevalueOfI : reflect.ValueOf(i).Elem()//获取对应的Type这个是用来获取属性方法的typeOfI : valueOfI.Type()//判断是否是structif typeOfI.Kind()!reflect.Struct{fmt.Println(except struct)return}//获取属性的数量numField : typeOfI.NumField()//遍历属性找到特定的属性进行操作for i:0;i numField;i{//获得属性的StructField次方法不同于Value中的Filed这个返回的是Fieldfield : typeOfI.Field(i)//获取属性名称fieldName : field.Namefmt.Println(fieldName)//找到名为Name的属性进行修改值if fieldNameName{//改变他的值为jackvalueOfI.Field(i).SetString(jack)}} }func main() {stu:Student{Name:susan,Age:58}test(stu)fmt.Println(stu.Name) }IO多路复用——select机制 select {case -chan1:fmt.Println(chan1 ready.)case -chan2:fmt.Println(chan2 ready.)default:fmt.Println(default)}每个线程或者进程都先到注册到相应的可接受 channel然后阻塞当注册的线程和进程准备好数据后channel会得到相应的数据。 2如果某个case中的channel已经ready则执行相应的语句并退出select流程否则有default会走default然后退出select没有defaultselect将阻塞直至channel ready3每个 case 语句仅能处理一个管道要么读要么写。4多个 case 语句的执行顺序是随机的。5存在 default 语句select 将不会阻塞但是存在 default 会影响性能。case后面不一定是读channel也可以写channel只要是对channel的操作就可以空的select语句将被阻塞直至panic 使用场景 2.1 超时控制 func (n *node) waitForConnectPkt() {select {case -n.connected:log.Println(接收到连接包)case -time.After(time.Second * 5):log.Println(接收连接包超时)n.conn.Close()} } 2.2 无阻塞获取值 func (w *wantConn) waiting() bool {select {case -w.ready:return falsedefault:return true} } 2.3 类事件驱动循环 func (n *node) heartbeatDetect() {for {select {case -n.heartbeat:// 收到心跳信号则退出select等待下一次心跳breakcase -time.After(time.Second*3):// 心跳超时关闭连接n.conn.Close()return}} }延迟函数——defer 每个 defer 语句都对应一个_defer 实例多个实例使用指针连接起来形成一个单连表保存在 gotoutine 数据结构中每次插入_defer 实例均插入到链表的头部函数结束再一次从头部取出从而形成后进先出的效果。 延迟函数执行按照后进先出的顺序执行即先出现的 defer 最后执行。延迟函数可能操作主函数的返回值。申请资源后立即使用 defer 关闭资源是个好习惯。 上下文控制——Context Go 的 Context 的数据结构包含 DeadlineDoneErrValueDeadline Deadline 方法返回一个 time.Time表示当前 Context 应该结束的时间Done 方法当 Context 被取消或者超时时候返回的一个 close 的 channel告诉给 context 相关的函数要停止当前工作然后返回了Err 表示 context 被取消的原因Value 方法表示 context 实现共享数据存储的地方是协程安全的 应用1上下文控制2多个 goroutine 之间的数据交互等3超时控制到某个时间点超时过多久超时。 互斥锁——Mutex 1正常模式 当前的mutex只有一个goruntine来获取那么没有竞争直接返回。新的goruntine进来如果当前mutex已经被获取了则该goruntine进入一个先入先出的waiter队列在mutex被释放后waiter按照先进先出的方式获取锁。该goruntine会处于自旋状态(不挂起继续占有cpu)。新的goruntine进来mutex处于空闲状态将参与竞争。新来的 goroutine 有先天的优势它们正在 CPU 中运行可能它们的数量还不少所以在高并发情况下被唤醒的 waiter 可能比较悲剧地获取不到锁这时它会被插入到队列的前面。如果 waiter 获取不到锁的时间超过阈值 1 毫秒那么这个 Mutex 就进入到了饥饿模式。 2饥饿模式 在饥饿模式下Mutex 的拥有者将直接把锁交给队列最前面的 waiter。新来的 goroutine 不会尝试获取锁即使看起来锁没有被持有它也不会去抢也不会 spin自旋它会乖乖地加入到等待队列的尾部。 如果拥有 Mutex 的 waiter 发现下面两种情况的其中之一它就会把这个 Mutex 转换成正常模式: 此 waiter 已经是队列中的最后一个 waiter 了没有其它的等待锁的 goroutine 了此 waiter 的等待时间小于 1 毫秒。 问题 是否可以对Golang中的map元素取地址 不可以因为map的元素可能会因为新元素的添加或者map的扩容而被移动所以直接获取map元素的地址可能会引用到错误的元素。 Golang 调用函数传入结构体时应该传值还是指针 结构体的大小如果结构体非常大使用指针传递会更有效率因为这样只会复制指针值一般是8字节而不是复制整个结构体。如果结构体小值传递和指针传递的性能差异可能可以忽略不计。是否需要修改原始结构体如果你需要在函数中修改原始结构体你应该使用指针传递。如果你使用值传递函数会接收结构体的一个副本你在函数中对结构体的修改不会影响到原始的结构体。 单引号双引号反引号的区别 单引号表示byte类型或rune类型对应 uint8和int32类型默认是 rune 类型。byte用来强调数据是raw data而不是数字而rune用来表示Unicode的code point。双引号才是字符串实际上是字符数组。可以用索引号访问某字节也可以用len()函数来获取字符串所占的字节长度。反引号表示字符串字面量但不支持任何转义序列。字面量 raw literal string 的意思是你定义时写的啥样它就啥样你有换行它就换行。你写转义字符它也就展示转义字符。 怎么控制并发数量 有缓冲通道 func main() {count : 10 // 最大支持并发sum : 100 // 任务总数wg : sync.WaitGroup{} //控制主协程等待所有子协程执行完之后再退出。c : make(chan struct{}, count) // 控制任务并发的chandefer close(c)for i:0; isum;i{wg.Add(1)c - struct{}{} // 作用类似于waitgroup.Add(1)go func(j int) {defer wg.Done()fmt.Println(j)- c // 执行完毕释放资源}(i)}wg.Wait() }第三方协程池 import (logtimegithub.com/Jeffail/tunny ) func main() {pool : tunny.NewFunc(10, func(i interface{}) interface{} {log.Println(i)time.Sleep(time.Second)return nil})defer pool.Close()for i : 0; i 500; i {go pool.Process(i)}time.Sleep(time.Second * 4) }
http://www.dnsts.com.cn/news/19894.html

相关文章:

  • 电商网站建设服务凡科小程序登录
  • 网站搭建的步骤wordpress 提权攻击
  • 网站设计制作平台哪个好甘肃再就业建设集团网站
  • 建筑网建设通网站作用前几年做那个网站致富
  • 建立一个网站沈阳做网站软件
  • 行业协会网站织梦模板自建站有哪些
  • 那个网站可以免费建站网站域名登陆
  • 国外网站代做你做的网站会不会被人模仿
  • 学网站建设的软件网络销售渠道
  • 网站上海备案查询哈尔滨百姓网免费发布信息
  • 2014网站设计网站系统繁忙怎么办
  • 广告素材网站哪个比较好祝贺公司网站上线
  • 北京建设工程主管部门网站wordpress获取用户位置
  • 刷数据网站怎么推广做货源的网站
  • 网站如何设计方案wordpress hotnews syntax error
  • 网站开发 法律声明wordpress可视化功能
  • 企业网站开发哪家好网站出现建设中
  • 网站开发人员属于什么设计方案
  • 建站之星免费wordpress的数据库有多大
  • 莆田网站建设培训建设网站的各种问题
  • 网站怎么做图片动态图片不显示不出来普通网站成微网站开发
  • 安阳市网站建设西昌手机网站建设成都彩钢顶防水
  • 河北省建设机械协会是正规网站吗软件技术方案
  • 佛山模板网站建设ftp网站服务器
  • 网站维护是什么专业桂林两江四湖在哪里
  • 青岛外贸网站建站公司官网源码下载
  • 制作网站的图片素材建设厅网站账户名忘了怎么查
  • 网页设计与网站建设分析制作网页时经常使用什么对网页的布局进行控制
  • 宝塔面板wordpress安装网站关键词怎么优化
  • 江西省建设工程造价管理局网站网站后端开发是什么