python线程安全及多进程多线程实现方法详解


Posted in Python onSeptember 27, 2019

进程和线程的区别

  • 进程是对运行时程序的封装,是系统资源调度和分配的基本单位
  • 线程是进程的子任务,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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python从网络读取图片并直接进行处理的方法
May 22 Python
Django中的“惰性翻译”方法的相关使用
Jul 27 Python
python实现简单点对点(p2p)聊天
Sep 13 Python
python的变量与赋值详细分析
Nov 08 Python
python如何求解两数的最大公约数
Sep 27 Python
python3 中文乱码与默认编码格式设定方法
Oct 31 Python
PyQt4实时显示文本内容GUI的示例
Jun 14 Python
pygame库实现俄罗斯方块小游戏
Oct 29 Python
Python PyQt5整理介绍
Apr 01 Python
Python求凸包及多边形面积教程
Apr 12 Python
Pycharm安装Qt Design快捷工具的详细教程
Nov 18 Python
利用Python+OpenCV三步去除水印
May 28 Python
python config文件的读写操作示例
Sep 27 #Python
Python queue队列原理与应用案例分析
Sep 27 #Python
python多环境切换及pyenv使用过程详解
Sep 27 #Python
python 哈希表实现简单python字典代码实例
Sep 27 #Python
python实现发送form-data数据的方法详解
Sep 27 #Python
PyCharm更改字体和界面样式的方法步骤
Sep 27 #Python
Pycharm 字体大小调整设置的方法实现
Sep 27 #Python
You might like
php 禁止页面缓存输出
2009/01/07 PHP
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
JavaScript中的property和attribute介绍
2011/12/26 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
js与jQuery 获取父窗、子窗的iframe
2013/12/20 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
默认浏览器设置及vue自动打开页面的方法
2018/09/21 Javascript
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
Python内置加密模块用法解析
2019/11/25 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
CSS3关于z-index不生效问题的解决
2020/02/19 HTML / CSS
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
自主招生自荐信范文
2013/12/04 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
教师个人事迹材料
2014/12/17 职场文书
入党介绍人考察意见
2015/06/01 职场文书
关于运动会的广播稿
2015/08/19 职场文书
股东协议书范本2016
2016/03/21 职场文书
详解MindSpore自定义模型损失函数
2021/06/30 Python