简单聊聊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的线程同步我还没用过,这里就不好讨论了。


相关文章
|
13天前
|
数据采集 存储 安全
如何确保Python Queue的线程和进程安全性:使用锁的技巧
本文探讨了在Python爬虫技术中使用锁来保障Queue(队列)的线程和进程安全性。通过分析`queue.Queue`及`multiprocessing.Queue`的基本线程与进程安全特性,文章指出在特定场景下使用锁的重要性。文中还提供了一个综合示例,该示例利用亿牛云爬虫代理服务、多线程技术和锁机制,实现了高效且安全的网页数据采集流程。示例涵盖了代理IP、User-Agent和Cookie的设置,以及如何使用BeautifulSoup解析HTML内容并将其保存为文档。通过这种方式,不仅提高了数据采集效率,还有效避免了并发环境下的数据竞争问题。
如何确保Python Queue的线程和进程安全性:使用锁的技巧
|
13天前
|
Java 开发者
Java多线程教程:使用ReentrantLock实现高级锁功能
Java多线程教程:使用ReentrantLock实现高级锁功能
17 1
|
6天前
|
安全 Java API
Java线程池原理与锁机制分析
综上所述,Java线程池和锁机制是并发编程中极其重要的两个部分。线程池主要用于管理线程的生命周期和执行并发任务,而锁机制则用于保障线程安全和防止数据的并发错误。它们深入地结合在一起,成为Java高效并发编程实践中的关键要素。
5 0
|
11天前
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
11天前
|
消息中间件 存储 安全
python多进程并发编程之互斥锁与进程间的通信
python多进程并发编程之互斥锁与进程间的通信
|
14天前
|
Java 开发者
解锁Java并发编程的秘密武器!揭秘AQS,让你的代码从此告别‘锁’事烦恼,多线程同步不再是梦!
【8月更文挑战第25天】AbstractQueuedSynchronizer(AQS)是Java并发包中的核心组件,作为多种同步工具类(如ReentrantLock和CountDownLatch等)的基础。AQS通过维护一个表示同步状态的`state`变量和一个FIFO线程等待队列,提供了一种高效灵活的同步机制。它支持独占式和共享式两种资源访问模式。内部使用CLH锁队列管理等待线程,当线程尝试获取已持有的锁时,会被放入队列并阻塞,直至锁被释放。AQS的巧妙设计极大地丰富了Java并发编程的能力。
26 0
|
2天前
|
安全 大数据 Go
深入探索Go语言并发编程:Goroutines与Channels的实战应用
在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
|
5天前
|
Go
golang语言之go常用命令
这篇文章列出了常用的Go语言命令,如`go run`、`go install`、`go build`、`go help`、`go get`、`go mod`、`go test`、`go tool`、`go vet`、`go fmt`、`go doc`、`go version`和`go env`,以及它们的基本用法和功能。
15 6
|
5天前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
13 3
|
7天前
|
缓存 安全 Java
如何利用Go语言提升微服务架构的性能
在当今的软件开发中,微服务架构逐渐成为主流选择,它通过将应用程序拆分为多个小服务来提升灵活性和可维护性。然而,如何确保这些微服务高效且稳定地运行是一个关键问题。Go语言,以其高效的并发处理能力和简洁的语法,成为解决这一问题的理想工具。本文将探讨如何通过Go语言优化微服务架构的性能,包括高效的并发编程、内存管理技巧以及如何利用Go生态系统中的工具来提升服务的响应速度和资源利用率。