简单聊聊Go和python的多线程操作吧(互斥锁,线程同步)

简介: 简单聊聊Go和python的多线程操作吧(互斥锁,线程同步)
+关注继续查看

最近学习使用go来做一个简单的爬虫,代码中用到了多线程,就想趁机会记录一下学习感想。

场景是:在从文件中读取到多少个基金号就开启多少个线程去获取相关基金的数据,并且在所有基金信息(线程)获取完成后进行存储和筛选。

目测需要用到的技术有,互斥锁,线程同步

Go和python的锁

在Go中, 锁和解锁

首先,在多线程中,每一个基金爬取后的数据都需要写入一个切片,那我们不希望线程可以同时访问这个切片,所以再写入资源的时候需要加锁。

var mutex sync.Mutex
mutex.Lock()
// 更新切片
mutex.Unlock()

在第一次被使用后,不能再对sync.Mutex进行复制。

在python中,请求锁和释放锁,其实差不多。

from threading import Lock
lock = Lock()
lock.acquire()
# 更新数据
lock.release()

锁的类型不只有互斥锁,go中有RWMutex读写互斥锁,我还没有接触过,不好做解释,python中有RLock锁是对Lock做了优化。python还有GIL全局锁的概念,如果根据这个概念,那在python中lock.acquire()请求锁,和lock.release()释放锁的命名就说到通了,有点意思。

Go的线程同步

再聊聊go的线程同步,线程同步不是必须的,还是需要根据场景来看的,如果我们需要所有的数据产生后,统一处理的话,线程同步是有必要的。

在go中,sync.WaitGroup

wg = sync.WaitGroup
for i := 0; i < 5; i++ {
  wg.Add(1)
  go func() {
    // Get fund info
    wg.Done()
  }()
}
wg.Wait

sync.WaitGroup有一个计数器,有点像python回收机制的引用记数,当计数器为0,wait就会返回,否则就会一直阻塞goroutine直到计数器归零。通过使用Done()来让计数器减一。

python的线程同步我还没用过,这里就不好讨论了。


相关文章
|
26天前
|
存储 Go Python
分别用python和go语言来实现的风靡一时的2048 游戏,包含完整代码
@[TOC](目录) 2048 游戏实现主要包括以下几个步骤: 1. 创建一个棋盘,通常使用二维列表表示。 2. 实现棋子的移动规则,左移、右移、上移、下移。 3. 判断游戏是否结束,即棋盘是否已满或者无空位可移动。 4. 实现游戏界面的显示。 # 1、Python实现 下面是一个简单的 Python 实现示例,运行效果如下: ```python import pygame import sys import random # 初始化 pygame pygame.init() # 设置屏幕大小 screen_size = (80
|
1月前
|
Rust 自然语言处理 Java
单链表的多语言表达:C++、Java、Python、Go、Rust
单链表是一种链式数据结构,由一个头节点和一些指向下一个节点的指针组成。每个节点包含一个数据元素和指向下一个节点的指针。头节点没有数据,只用于表示链表的开始位置。单链表相对于数组的优点是插入和删除元素时不需要移动其他元素,时间复杂度为O(1)。但是,在查找元素时,单链表比数组要慢,时间复杂度为O(n)。
16574 7
|
4月前
|
Shell Go 数据安全/隐私保护
Go/Python 免杀
Go/Python 免杀
|
4月前
|
JSON 编译器 Go
人们都在说Go=C+Python,有必要先学个入门再说对不对2
人们都在说Go=C+Python,有必要先学个入门再说对不对
34 0
|
4月前
|
存储 程序员 编译器
人们都在说Go=C+Python,有必要先学个入门再说对不对
人们都在说Go=C+Python,有必要先学个入门再说对不对
39 0
|
4月前
|
Rust JavaScript Go
为什么 Python、Go 和 Rust 都不支持三元运算符?
为什么 Python、Go 和 Rust 都不支持三元运算符?
104 0
为什么 Python、Go 和 Rust 都不支持三元运算符?
|
4月前
|
Rust 算法 JavaScript
阿里巴巴的算法面试题JAVA,python,go,rust js解法大全
阿里巴巴的算法面试题JAVA,python,go,rust js解法大全
98 0
|
4月前
|
Go API 数据安全/隐私保护
Grafana的自动登入(Go和Python分别实现)
Grafana的自动登入(Go和Python分别实现)
149 1
Grafana的自动登入(Go和Python分别实现)
|
4月前
|
存储 Rust JavaScript
2023java面试算法真题 python go rust js 解法
2023java面试算法真题 python go rust js 解法
81 0
|
4月前
|
Rust 算法 JavaScript
2023 java最新面试题 java python go rust js解法
2023 java最新面试题 java python go rust js解法
89 0
相关产品
云迁移中心
推荐文章
更多