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生成IP段的方法
Jul 07 Python
python查看FTP是否能连接成功的方法
Jul 30 Python
Python标准库之itertools库的使用方法
Sep 07 Python
关于Python如何避免循环导入问题详解
Sep 14 Python
Python绘制3d螺旋曲线图实例代码
Dec 20 Python
Flask框架Jinjia模板常用语法总结
Jul 19 Python
python输出带颜色字体实例方法
Sep 01 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
Jan 19 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
python print 格式化输出,动态指定长度的实现
Apr 12 Python
Python3如何判断三角形的类型
Apr 12 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
Jun 30 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/05/11 PHP
PHP 面向对象 PHP5 中的常量
2010/05/05 PHP
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
浅谈js中的this问题
2017/08/31 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
浅谈js闭包理解
2019/04/01 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
js制作提示框插件
2020/12/24 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
python检查指定文件是否存在的方法
2015/07/06 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
python根据url地址下载小文件的实例
2018/12/18 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
Python检查图片是否损坏及图片类型是否正确过程详解
2019/09/30 Python
先进个人获奖感言
2014/01/24 职场文书
幼儿园门卫制度
2014/01/29 职场文书
食品安全检查制度
2014/02/03 职场文书
银行类自荐信
2014/02/04 职场文书
《燕子》教学反思
2014/02/18 职场文书
班主任新年寄语
2014/04/04 职场文书
工作报告范文
2019/06/20 职场文书
Django框架之路由用法
2022/06/10 Python