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 元类使用说明
Dec 18 Python
一则python3的简单爬虫代码
May 26 Python
Python-基础-入门 简介
Aug 09 Python
从Python程序中访问Java类的简单示例
Apr 20 Python
Python中的并发处理之asyncio包使用的详解
Apr 03 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
Python简单读写Xls格式文档的方法示例
Aug 17 Python
python pyheatmap包绘制热力图
Nov 09 Python
Python二叉树的镜像转换实现方法示例
Mar 06 Python
如何用Python来理一理红楼梦里的那些关系
Aug 14 Python
Python urllib2运行过程原理解析
Jun 04 Python
Python控制台输出俄罗斯方块的方法实例
Apr 17 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封装CURL
2019/03/06 PHP
jquery创建div 实现代码
2009/04/27 Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
jquery的Tooltip插件 qtip使用详细说明
2010/09/08 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
js获取ip和地区
2017/03/10 Javascript
基于AngularJS实现的工资计算器实例
2017/06/16 Javascript
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
原生JavaScript实现remove()和recover()功能示例
2018/07/24 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
python用字典统计单词或汉字词个数示例
2014/04/22 Python
Python使用filetype精确判断文件类型
2017/07/02 Python
tensorflow 使用flags定义命令行参数的方法
2018/04/23 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
Python多线程多进程实例对比解析
2020/03/12 Python
python判断正负数方式
2020/06/03 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
颇特女士:NET-A-PORTER(直邮中国)
2020/07/11 全球购物
大学生简历中个人的自我评价
2013/10/06 职场文书
厨房工作人员岗位职责
2013/11/15 职场文书
数控技术专科生自我评价
2014/01/08 职场文书
劳动模范事迹材料
2014/01/19 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/09/30 职场文书
六查六看自检自查剖析材料
2014/10/14 职场文书
平凡的世界读书笔记
2015/06/25 职场文书
三八妇女节主持词
2015/07/04 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
简述python四种分词工具,盘点哪个更好用?
2021/04/13 Python
如何使用CocosCreator对象池
2021/04/14 Javascript
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis
spring注解 @PropertySource配置数据源全流程
2022/03/25 Java/Android
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android