python线程安全及多进程多线程实现方法详解
作者:DRQ丶 发布时间:2023-08-27 02:01:54
标签:python,线程,安全,多,进程
进程和线程的区别
进程是对运行时程序的封装,是系统资源调度和分配的基本单位
线程是进程的子任务,cpu调度和分配的基本单位,实现进程内并发。
一个进程可以包含多个线程,线程依赖进程存在,并共享进程内存
什么是线程安全
一个线程的修改被另一个线程的修改覆盖掉。
python中哪些操作是线程安全的
一个操作可以在多线程环境中使用,并且获得正确的结果。
线程安全的操作线程是顺序执行的而不是并发执行的。
一般涉及到写操作需要考虑如何让多个线程安全访问数据。
线程同步的方式
互斥量(锁): 通过互斥机制防止多个线程同时访问公共资源。
信号量(Semphare): 控制同一时刻多个线程访问同一个资源的线程数。 ps:python的threading 文档
事件(信号): 通过通知的方式保持多个线程的同步。
进程间的通信方式 (IPC:Inter-Process Communication 进程间传递信号或者数据)
管道/匿名管道/有名管道(pipe)
信号(Signal):比如用户使用ctrl+c产生SIGINT程序终止信号
消息队列(Message)
共享内存(share memory)
进程间的信号量(Semaphore)
套接字(socket):最常用的方式,我们的web应用就是这种方式
多线程的例子
# python实现多线程
import threading
lock = threading.Lock()
n = [0]
def foo():
with lock: # 加锁
n[0] = n[0] + 1
n[0] = n[0] + 1
threads = [] # 用来储存所有线程
for i in range(5000):
t = threading.Thread(target=foo) # 传入foo函数
threads.append(t)
for t in threads:
t.start()
print(n)
多进程的例子
python有GIL,可以用多进程实现cpu密集程序
multiprocessing 多进程模块
multiprocessing.Process 类实现多进程
一般在cpu密集的程序里面使用多进程,避免GIL的影响
# 多进程
import multiprocessing
def fib(n):
if n<= 1:
return 1
return fib(n-1) + fib(n-2)
if __name__ == '__main__':
jobs = []
for i in range(10,20):
p = multiprocessing.Process(target=fib, args=(i,))
jobs.append(p)
p.start()
来源:https://www.cnblogs.com/dairuiquan/p/11594022.html


猜你喜欢
- 线程间通信方法 1. 通信方法线程间使用全局变量进行通信 2. 共享
- 前言有时候python自带异常不够用,如同java,python也可以自定义异常,并且可以手动抛出。注意,自定义异常只能由自己抛出。pyth
- 下面一段代码是小编给大家介绍的Python ldap实现登录实例代码,一起看看吧ldap_config = { 'lda
- 这篇文章我们来讲讲如何在python使用bs4模块返回值中正确使用find和find_all来取值。我们先来看看find函数在两种场景使用:
- 前言python内建函数指的是python自带的函数,这种函数不需要定义,并且不同的内建函数具有不同的功能,可以直接使用。A类abs() 函
- wheel文件Wheel和Egg都是python的打包格式,目的是支持不需要编译或制作的安装过程,实际上也是一种压缩文件,将.whl的后缀改
- 一、数据备份1、使用mysqldump命令备份mysqldump命令将数据库中的数据备份成一个文本文件。表的结构和表中的数据将存储在生成的文
- 1. 获取时间函数功能返回格式CURDATE(), CURRENT_DATE()返回当前日期,只包含年、月、日2022-03-08CURTI
- <script type="text/javascript">一、获取url所有参数值function US
- 前言当需要将多张图像拼接成一张更大的图像时,通常会用到图片拼接技术。这种技术在许多领域中都有广泛的应用,例如计算机视觉、图像处理、卫星图像、
- 上午在分析索引的使用情况,想看一下数据库什么时候启动的,确保统计的数据没有问题,可以使用下面三种方法查询:--2008及之后版本才有SELE
- base64 其实是一种编码转换方式, 将 ASCII 字符转换成普通文本, 是网络上最常见的用于传输8Bit字节代码的编码方式之一。bas
- 终于皇天不负有心人,答案还是让我找到了。 网上的都是这样用的 $content = iconv("utf-8",&quo
- Tensorboard:如何更直观的观察数据在神经网络中的变化,或是已经构建的神经网络的结构。上一篇文章说到,可以使用matplotlib第
- Windows上安装mysql-8.0.29-winx64,供大家参考,具体内容如下1.进入官网找到自己所需的安装包:https://dev
- 这次自己做了一个小程序来玩,在登录方面一直有些模糊,网上看了很多文档后,得出以下一种解决方案。环境说明:1、小程序只需要拿到openid,其
- 1.下载python2.7.xwget https://www.python.org/ftp/python/2.7.6/Python-2.7
- UserWarning: indexing with dtype torch.uint8 is now deprecated, please
- GIT作为源码管理的方式现在是越来越流行了,在VisualStudio 2012中,就通过插件的现实对GIT进行了官方支持,并且这个插件在V
- python模块中的__all__属性,可用于模块导入时限制,如:from module import *此时被导入模块若定义了__all_