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


相关文章
|
2月前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
2月前
|
存储 安全 算法
Go语言是如何支持多线程的
【10月更文挑战第21】Go语言是如何支持多线程的
116 72
|
21天前
|
数据采集 存储 数据处理
Python中的多线程编程及其在数据处理中的应用
本文深入探讨了Python中多线程编程的概念、原理和实现方法,并详细介绍了其在数据处理领域的应用。通过对比单线程与多线程的性能差异,展示了多线程编程在提升程序运行效率方面的显著优势。文章还提供了实际案例,帮助读者更好地理解和掌握多线程编程技术。
|
1月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
1月前
|
Java Unix 调度
python多线程!
本文介绍了线程的基本概念、多线程技术、线程的创建与管理、线程间的通信与同步机制,以及线程池和队列模块的使用。文章详细讲解了如何使用 `_thread` 和 `threading` 模块创建和管理线程,介绍了线程锁 `Lock` 的作用和使用方法,解决了多线程环境下的数据共享问题。此外,还介绍了 `Timer` 定时器和 `ThreadPoolExecutor` 线程池的使用,最后通过一个具体的案例展示了如何使用多线程爬取电影票房数据。文章还对比了进程和线程的优缺点,并讨论了计算密集型和IO密集型任务的适用场景。
68 4
|
2月前
|
Go 调度 开发者
Go语言多线程的优势
【10月更文挑战第15天】
20 4
|
26天前
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
56 0
|
2月前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
Python
python中上双互斥锁的线程执行流程
import threading def sing(): print('进入sing -----------------') for i in range(3): print('进入sing循环 -----------------') l1.acquire() print('sing上锁 -----------------') print('唱歌。
1187 0
|
13天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!