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

wordpress双语言设置/公司网站怎么优化

wordpress双语言设置,公司网站怎么优化,08服务器做网站,怎样才能创建网站进程和线程A。进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B。线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C。一个进程可以创建和撤销多个线程&#xff1…
进程和线程A。进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B。线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C。一个进程可以创建和撤销多个线程;同一进程中的多个线程之间可以并发执行。

并发和并行
并发:多线程程序在一个核的cpu上运行
并行:多线程程序在多个核的cpu上运行
举例。。一个妈给一个碗给多个小孩喂饭,,是并发
    一个妈给每个小孩一人一个碗,就是并行

并发                       并行

协程和线程
协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级协程,这些用户级线程的调度也是自己实现的。
线程:一个线程上可以跑多个协程,协程是轻量级的线程。

例子

package mainimport ("fmt""time"
)func test() {var i intfor {fmt.Println(i)time.Sleep(time.Second)i++}
}
func main() {go test() //起一个协程执行test()for {fmt.Println("i : runnging in main")time.Sleep(time.Second )}
}

-

--

设置Golang运行的cpu核数。

1.8版本以上,默认跑多个核

package mainimport ("fmt""runtime"
)func main() {num := runtime.NumCPU()runtime.GOMAXPROCS(num)fmt.Println(num)
}

并发计算

package mainimport ("fmt""sync""time"
)var (m    = make(map[int]uint64)lock sync.Mutex
)type task struct {n int
}func calc(t *task) {var sum uint64sum = 1for i := 1; i < t.n; i++ {sum *= uint64(i)}fmt.Println(t.n, sum)lock.Lock()m[t.n] = sumlock.Unlock()}func main() {for i := 0; i < 16; i++ {t := &task{n: i}go calc(t)//并发执行,谁快谁先出 
    }time.Sleep(10 * time.Second)//lock.Lock()//for k, v := range m {//    fmt.Printf("%d!=%v\n", k, v)//}//lock.Unlock()
}
并发计算

 Channel

channel概念
a。类似unix中的管道(pipe)
b.先进先出
c。线程安全,多个goroutine同时访问,不需要枷锁
d。channel是有类型的,一个整数的channel只能存整数

 channel声明

var name chan string
var age chan int
var mapchan chan map[string]string
var test chan student
var test1 chan *student

channel初始化

使用make进行初始化
var test chan int
test = make(chan int,10)var test chan string
test=make(chan string,10)

channel基本操作

从channel读取数据
var
testChan chan int testChan = make(chan int, 10) var a int a = <-testChan

-从channel写入数据

var testChan chan int
testChan = make(chan int, 10)
var a int = 10
testChan <- a

第一个例子

package mainimport "fmt"type student struct {name string
}func main() {var stuChan chan *studentstuChan = make(chan *student, 10)stu := student{name: "stu001"}stuChan <- &stuvar stu01 interface{}stu01 = <-stuChanvar stu02 *studentstu02, ok := stu01.(*student)if !ok {fmt.Println("can not convert")return}fmt.Println(stu02)
}

goroutine与channel

package mainimport ("fmt""time"
)//起一个读的协程
func write(ch chan int) {for i := 0; i < 1000; i++ {ch <- i}
}func read(ch chan int) {for {var b intb = <-chfmt.Println(b)}
}func main() {intChan := make(chan int, 10)go write(intChan)go read(intChan)time.Sleep(10 * time.Second)
}

读,取,字符串

package mainimport ("fmt""time"
)func sendData(ch chan string) {ch <- "Washington"ch <- "Tripoli"ch <- "London"ch <- "Beijing"ch <- "Tokio"
}func getData(ch chan string) {var input stringfor {input = <-chfmt.Println(input)}
}func main() {ch := make(chan string)go sendData(ch)go getData(ch)time.Sleep(3 * time.Second)
}
读取字符串

 Channel缓冲区

只能放一个元素的testChan
var testChan chan int
testChan = make(chan int)
var a int
a = <-testChan

-

testChan是带缓冲区的chan,一次可以放10个元素
var
testChan chan int testChan = make(chan int, 10) var a int = 10 testChan <- a

 -

package mainimport ("fmt""sync""time"
)var (m    = make(map[int]uint64)lock sync.Mutex
)type task struct {n int
}func calc(t *task) {var sum uint64sum = 1for i := 1; i < t.n; i++ {sum *= uint64(i)}fmt.Println(t.n, sum)lock.Lock()m[t.n] = sumlock.Unlock()
}func main() {for i := 0; i < 16; i++ {t := &task{n: i}go calc(t)}time.Sleep(10 * time.Second)lock.Lock()for k, v := range m {fmt.Printf("%d!=%v\n", k, v)}lock.Unlock()
}
goroutine_lock
package mainimport ("fmt"
)func calc(taskChan chan int, resChan chan int, exitChan chan bool) {for v := range taskChan {flag := truefor i := 2; i < v; i++ {if v%i == 0 {flag = falsebreak}}if flag {resChan <- v}}fmt.Println("exit")exitChan <- true
}
func main() {intChan := make(chan int, 1000)resultChan := make(chan int, 1000)exitChan := make(chan bool, 8)go func() {for i := 0; i < 10000; i++ {intChan <- i}close(intChan)}()for i := 0; i < 8; i++ {go calc(intChan, resultChan, exitChan)}//等待所有计算的goroutine全部退出
    go func() {for i := 0; i < 8; i++ {<-exitChanfmt.Println("wait goroute", i, "exited")}close(resultChan)}()for v := range resultChan {fmt.Println(v)}}
goroutine_sync
package mainimport "fmt"func send(ch chan int, exitChan chan struct{}) {for i := 0; i < 10; i++ {ch <- i}close(ch)var a struct{}exitChan <- a
}
func recv(ch chan int, exitChan chan struct{}) {for {v, ok := <-chif !ok {break}fmt.Println(v)}var a struct{}exitChan <- a
}
func main() {var ch chan intch = make(chan int, 10)exitChan := make(chan struct{}, 2)go send(ch, exitChan)go recv(ch, exitChan)var total = 0for _ = range exitChan {total++if total == 2 {break}}
}
goroutine_sync2

检测管道是否关闭

package mainimport "fmt"func main() {var ch chan intch = make(chan int, 10)for i := 0; i < 10; i++ {ch <- i}close(ch)for {var b intb, ok := <-ch//检测管道是否关闭if ok == false {fmt.Println("chan is close")break}fmt.Println(b)}
}
检测管道是否关闭

 如何关闭chan

1. 使用内置函数close进行关闭,chan关闭之后,for range遍历chan中
已经存在的元素后结束
2. 使用内置函数close进行关闭,chan关闭之后,没有使用for range的写法
需要使用,v, ok := <- ch进行判断chan是否关闭

chan的只读和只写

只读的声明
Var 变量的名字 <-chan int
Var readChan <- chan int只写的声明
Var 变量的名字 chan<- int
Var writeChan chan<- int

 

package mainimport "fmt"//只写chan
func send(ch chan<- int, exitChan chan struct{}) {for i := 0; i < 10; i++ {ch <- i}close(ch)var a struct{}exitChan <- a
}//只读chan
func recv(ch <-chan int, exitChan chan struct{}) {for {v, ok := <-chif !ok {break}fmt.Println(v)}var a struct{}exitChan <- a
}func main() {var ch chan intch = make(chan int, 10) //初始化chanexitChan := make(chan struct{}, 2)go send(ch, exitChan)go recv(ch, exitChan)var total = 0for _ = range exitChan {total++if total == 2 {break}}}
只读只写示例chan

不阻塞

package mainimport "fmt"
import "time"func main() {var ch chan intch = make(chan int, 10)ch2 := make(chan int, 10)go func() {var i intfor {ch <- itime.Sleep(time.Second)ch2 <- i * itime.Sleep(time.Second)i++}}()for {select {case v := <-ch:fmt.Println(v)case v := <-ch2:fmt.Println(v)case <-time.After(time.Second):fmt.Println("get data timeout")time.Sleep(time.Second)}}
}
chan不阻塞

 

转载于:https://www.cnblogs.com/pyyu/p/8318417.html

http://www.jmfq.cn/news/4934107.html

相关文章:

  • win8建立网站/网络营销课程主要讲什么内容
  • 国内专门做情侣的网站商城/百度产品大全
  • 企业查在线查询官网/seo优化专员招聘
  • pc网站建设意见/信息流优化师怎么入行
  • 所有网站打不开/seo软文推广工具
  • 建盏/夫唯seo视频教程
  • 可以中英切换的网站怎么做/seo推广专员工作内容
  • 销售性网站建设需求/企业营销推广策划
  • 搞钱/seo中心
  • 网站维护中/济南网站推广
  • 空间设计英文/宁波seo外包推广公司
  • 深圳市宝安区西乡街道邮政编码/seo外链工具源码
  • 湘潭九华网站/广州商务网站建设
  • 大连市网站制作电话/网站模板套用教程
  • 关于网站建设的网站有哪些/安卓优化大师下载
  • 英铭广州网站建设/爱站长尾词
  • wordpress怎么修改固定链接/做网站怎么优化
  • 全国油价今日价格/宁波seo网络推广咨询热线
  • 个人网站和企业网站区别/岳阳网站界面设计
  • 免费做公司手机网站/贴吧引流推广
  • 品牌设计流程/郑州seo询搜点网络效果佳
  • 鹤壁市城乡一体化示范区官网入口/seo排名优化软件免费
  • 网站推广策划案关键词/网络公司推广公司
  • 公司网站.可以自己做吗/seo服务包括哪些
  • 自助建站系统哪个最好用/网络建站
  • com网站怎么注册/如何策划一个营销方案
  • android网站开发教程/适合35岁女人的培训班
  • 西安网站开发公司/百度收录批量查询工具
  • 触屏网站meta标签/百度指数人群画像哪里查询
  • 深圳什么公司做网站好/国际军事新闻最新消息