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


相关文章
|
5天前
|
Python
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
34 20
|
18天前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
97 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
3月前
|
数据采集 存储 数据处理
Python中的多线程编程及其在数据处理中的应用
本文深入探讨了Python中多线程编程的概念、原理和实现方法,并详细介绍了其在数据处理领域的应用。通过对比单线程与多线程的性能差异,展示了多线程编程在提升程序运行效率方面的显著优势。文章还提供了实际案例,帮助读者更好地理解和掌握多线程编程技术。
|
3月前
|
监控 JavaScript 前端开发
python中的线程和进程(一文带你了解)
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生分享技术心得的地方。如果你从我的文章中有所收获,欢迎关注我,我将持续更新更多优质内容,你的支持是我前进的动力!🎉🎉🎉
47 0
|
3月前
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
119 0
|
8天前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
38 17
|
17天前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
50 26
|
2月前
|
安全 Java API
【JavaEE】多线程编程引入——认识Thread类
Thread类,Thread中的run方法,在编程中怎么调度多线程
|
2月前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
234 2
|
2月前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####

推荐镜像

更多