Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
檀越@新空间
Coding Tree
提交
1d2b2b2c
C
Coding Tree
项目概览
檀越@新空间
/
Coding Tree
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
Coding Tree
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
“1cdf149b6fccf4fba030f0bb847965500960fa9b”上不存在“python/git@gitcode.net:s920243400/PaddleDetection.git”
提交
1d2b2b2c
编写于
9月 27, 2022
作者:
彭世瑜
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix
上级
dcf302e5
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
422 addition
and
1 deletion
+422
-1
blog/golang/golang-concurrency.md
blog/golang/golang-concurrency.md
+417
-0
blog/golang/index.md
blog/golang/index.md
+1
-1
blog/pay/start.md
blog/pay/start.md
+4
-0
未找到文件。
blog/golang/golang-concurrency.md
浏览文件 @
1d2b2b2c
...
...
@@ -127,3 +127,420 @@ step2: https://www.taobao.com/
step3: https://www.taobao.com/
step4: 87347
```
## golang并发编程之channel
Go提供了一种通道机制,用于goroutine之间
`共享数据`
通道需要指定
`数据类型`
通道分类:
-
无缓冲通道 同步通讯
-
缓冲通道 异步通讯
语法
```
go
// 整型无缓冲通道,默认零值
Unbuffered
:=
make
(
chan
int
)
// 整型缓冲通道
buffered
:=
make
(
chan
int
,
10
)
```
通道数据交换
```
go
channel
:=
make
(
chan
string
,
5
)
// 将值发送到通道
channel
<-
"hello"
// 从通道接收值
data
:=
<-
channel
```
通道的发送和接收特性
-
同一通道,发送操作之间是互斥的,接收操作之间也是互斥的
-
发送操作和接收操作中对元素值的处理都是不可分割的
-
发送操作在完全完成之前会被阻塞,接收操作也是如此
示例
```
go
package
main
import
(
"fmt"
"math/rand"
"time"
)
// 创建一个int类型的通道
var
value
=
make
(
chan
int
)
func
send
()
{
// 向通道发送一个随机值
rand
.
Seed
(
time
.
Now
()
.
UnixNano
())
v
:=
rand
.
Intn
(
10
)
time
.
Sleep
(
time
.
Second
*
3
)
value
<-
v
}
func
main
()
{
// 关闭通道
defer
close
(
value
)
go
send
()
fmt
.
Println
(
"wait..."
)
// 从通道接收值
v
:=
<-
value
fmt
.
Printf
(
"v: %v
\n
"
,
v
)
}
```
## golang并发编程之WaitGroup实现同步
示例1
```
go
package
main
import
(
"fmt"
)
func
showMessage
(
i
int
)
{
fmt
.
Printf
(
"i: %v
\n
"
,
i
)
}
func
main
()
{
for
i
:=
0
;
i
<
10
;
i
++
{
showMessage
(
i
)
}
}
```
输出
```
go
i
:
0
i
:
1
i
:
2
i
:
3
i
:
4
i
:
5
i
:
6
i
:
7
i
:
8
i
:
9
```
示例 2
```
go
package
main
import
(
"fmt"
)
func
showMessage
(
i
int
)
{
fmt
.
Printf
(
"i: %v
\n
"
,
i
)
}
func
main
()
{
for
i
:=
0
;
i
<
10
;
i
++
{
// 启动协程来执行
go
showMessage
(
i
)
}
// 主协程执行结束
fmt
.
Println
(
"end"
)
}
```
输出
```
go
i
:
0
end
```
示例 3
```
go
package
main
import
(
"fmt"
"sync"
)
var
wp
sync
.
WaitGroup
func
showMessage
(
i
int
)
{
defer
wp
.
Done
()
fmt
.
Printf
(
"i: %v
\n
"
,
i
)
}
func
main
()
{
for
i
:=
0
;
i
<
10
;
i
++
{
go
showMessage
(
i
)
wp
.
Add
(
1
)
}
wp
.
Wait
()
fmt
.
Println
(
"end"
)
}
```
输出
```
i: 4
i: 1
i: 0
i: 5
i: 7
i: 8
i: 2
i: 3
i: 9
i: 6
end
```
## golang并发编程之runtime包
runtime定义了协程管理的包
## Gosched
让出执行权限
示例
```
go
package
main
import
(
"fmt"
)
func
show
()
{
for
i
:=
0
;
i
<
2
;
i
++
{
fmt
.
Printf
(
"show i: %v
\n
"
,
i
)
}
}
func
main
()
{
go
show
()
for
i
:=
0
;
i
<
2
;
i
++
{
fmt
.
Printf
(
"main i: %v
\n
"
,
i
)
}
fmt
.
Println
(
"end"
)
}
```
输出
```
main i: 0
main i: 1
end
```
示例 2
```
go
package
main
import
(
"fmt"
"runtime"
)
func
show
()
{
for
i
:=
0
;
i
<
2
;
i
++
{
fmt
.
Printf
(
"show i: %v
\n
"
,
i
)
}
}
func
main
()
{
go
show
()
for
i
:=
0
;
i
<
2
;
i
++
{
// 让出执行权限,给其他子协程执行
runtime
.
Gosched
()
fmt
.
Printf
(
"main i: %v
\n
"
,
i
)
}
fmt
.
Println
(
"end"
)
}
```
输出
```
show i: 0
main i: 0
main i: 1
end
```
### Goexit
退出当前协程
示例
```
go
package
main
import
(
"fmt"
"runtime"
"time"
)
func
show
()
{
for
i
:=
0
;
i
<
10
;
i
++
{
fmt
.
Printf
(
"show i: %v
\n
"
,
i
)
if
i
>=
5
{
runtime
.
Goexit
()
}
}
}
func
main
()
{
go
show
()
time
.
Sleep
(
time
.
Second
)
fmt
.
Println
(
"end"
)
}
```
输出
```
show i: 0
show i: 1
show i: 2
show i: 3
show i: 4
show i: 5
end
```
### GOMAXPROCS
设置CPU数量
```
go
package
main
import
(
"fmt"
"runtime"
"time"
)
func
show
(
name
string
)
{
for
i
:=
0
;
i
<
10
;
i
++
{
fmt
.
Printf
(
"%v i: %v
\n
"
,
name
,
i
)
}
}
func
main
()
{
// 查看CPU核数
fmt
.
Printf
(
"runtime.NumCPU(): %v
\n
"
,
runtime
.
NumCPU
())
// runtime.NumCPU(): 8
// 设置CPU数量
runtime
.
GOMAXPROCS
(
2
)
go
show
(
"A"
)
go
show
(
"B"
)
time
.
Sleep
(
time
.
Second
)
fmt
.
Println
(
"end"
)
}
```
## golang并发编程之Mutex 互斥锁实现同步
示例
```
go
package
main
import
(
"fmt"
"sync"
"time"
)
var
value
=
100
var
wg
sync
.
WaitGroup
var
lock
sync
.
Mutex
func
add
()
{
defer
wg
.
Done
()
lock
.
Lock
()
time
.
Sleep
(
time
.
Millisecond
*
2
)
value
+=
1
fmt
.
Printf
(
"i++: %v
\n
"
,
value
)
lock
.
Unlock
()
}
func
sub
()
{
defer
wg
.
Done
()
lock
.
Lock
()
time
.
Sleep
(
time
.
Millisecond
*
10
)
value
-=
1
fmt
.
Printf
(
"i--: %v
\n
"
,
value
)
lock
.
Unlock
()
}
func
main
()
{
for
i
:=
0
;
i
<
100
;
i
++
{
wg
.
Add
(
1
)
go
add
()
wg
.
Add
(
1
)
go
sub
()
}
wg
.
Wait
()
fmt
.
Printf
(
"end: %v
\n
"
,
value
)
}
```
blog/golang/index.md
浏览文件 @
1d2b2b2c
...
...
@@ -52,4 +52,4 @@
https://www.bilibili.com/video/BV1ME411Y71o?p=27&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
https://www.bilibili.com/video/BV1zR4y1t7Wj/?p=68&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
\ No newline at end of file
https://www.bilibili.com/video/BV1zR4y1t7Wj/?p=72&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
\ No newline at end of file
blog/pay/start.md
浏览文件 @
1d2b2b2c
...
...
@@ -13,6 +13,10 @@
4.
商户证书
-
微信商户平台:https://pay.weixin.qq.com/
-
文档:https://kf.qq.com/faq/161222NneAJf161222U7fARv.html
-
下载证书工具:
-
windows版本 :https://wx.gtimg.com/mch/files/WXCertUtil.exe
-
mac版本 :https://wx.gtimg.com/mch/files/WXCertUtil.dmg
5.
微信平台证书
-
Java命令行下载工具: https://github.com/wechatpay-apiv3/CertificateDownloader
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录