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实现批量把SVG格式转成png、pdf格式的代码分享
Aug 21 Python
python检测某个变量是否有定义的方法
May 20 Python
Python 正则表达式实现计算器功能
Apr 29 Python
一篇文章快速了解Python的GIL
Jan 12 Python
wxpython实现图书管理系统
Mar 12 Python
浅谈Python爬虫基本套路
Mar 25 Python
python selenium循环登陆网站的实现
Nov 04 Python
python3 sleep 延时秒 毫秒实例
May 04 Python
Windows下pycharm安装第三方库失败(通用解决方案)
Sep 17 Python
python时间time模块处理大全
Oct 25 Python
python中使用.py配置文件的方法详解
Nov 23 Python
学会Python数据可视化必须尝试这7个库
Jun 16 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
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
2019/05/01 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
JavaScript去掉空格的方法集合
2010/12/28 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
2016/05/12 Javascript
判断输入的字符串是否是日期格式的简单方法
2016/07/11 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
2016/11/25 Javascript
jquery中关于bind()方法的使用技巧分享
2017/03/30 jQuery
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
javascript input输入框模糊提示功能的实现
2017/09/25 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
javascript实现小型区块链功能
2019/04/03 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
使用pip安装python库的多种方式
2019/07/31 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
浅谈PyTorch中in-place operation的含义
2020/06/27 Python
python的launcher用法知识点总结
2020/08/07 Python
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
酒店节能减排方案
2014/05/26 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
2014年党务公开工作总结
2014/12/09 职场文书
德劲DE1108畅想
2021/04/22 无线电
如何在python中实现ECDSA你知道吗
2021/11/23 Python
Spring事务管理下synchronized锁失效问题的解决方法
2022/03/31 Java/Android