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中lambda函数 list comprehension 和 zip函数使用指南
Sep 28 Python
python复制与引用用法分析
Apr 08 Python
详解python实现线程安全的单例模式
Mar 05 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
Python线程下使用锁的技巧分享
Sep 13 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
python实现递归查找某个路径下所有文件中的中文字符
Aug 31 Python
python列表推导和生成器表达式知识点总结
Jan 10 Python
简单介绍一下pyinstaller打包以及安全性的实现
Jun 02 Python
Python趣味入门教程之循环语句while
Aug 26 Python
python中子类与父类的关系基础知识点
Feb 02 Python
Python借助with语句实现代码段只执行有限次
Mar 23 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
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
php常用字符串比较函数实例汇总
2014/11/24 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
php获取图片信息的方法详解
2015/12/10 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
2017/05/12 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
template.js前端模板引擎使用详解
2017/10/10 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
2019/03/01 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
Python常用库推荐
2016/12/04 Python
深入理解NumPy简明教程---数组1
2016/12/17 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
python3调用百度翻译API实现实时翻译
2018/08/16 Python
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
2019/08/02 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
南京迈特望C/C++面试题
2012/07/09 面试题
华为c/c++笔试题
2016/01/25 面试题
运动会广播稿30字
2014/01/21 职场文书
抵押贷款承诺书
2014/05/30 职场文书
python通过opencv调用摄像头操作实例分析
2021/06/07 Python
MySQL查询日期时间
2022/05/15 MySQL