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 相关文章推荐
详解Django中的form库的使用
Jul 18 Python
在Django中编写模版节点及注册标签的方法
Jul 20 Python
Windows下python3.7安装教程
Jul 31 Python
Python面向对象程序设计类的多态用法详解
Apr 12 Python
numpy数组之存取文件的实现示例
May 24 Python
python调用支付宝支付接口流程
Aug 15 Python
python画微信表情符的实例代码
Oct 09 Python
Django 返回json数据的实现示例
Mar 05 Python
django models里数据表插入数据id自增操作
Jul 15 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
Oct 27 Python
如何在Python中创建二叉树
Mar 30 Python
python计算列表元素与乘积详情
Aug 05 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实现框架(二)
2006/10/09 PHP
逐步提升php框架的性能
2008/01/10 PHP
用PHP+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
JavaScript游戏之优化篇
2010/11/08 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
JS中数组重排序方法
2016/11/11 Javascript
Bootstrap的modal拖动效果
2016/12/25 Javascript
详解VueJs异步动态加载块
2017/03/09 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
JavaScript实现弹出窗口效果
2020/12/09 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
Python中optparse模块使用浅析
2015/01/01 Python
python web框架学习笔记
2016/05/03 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
pycharm中leetcode插件使用图文详解
2020/12/07 Python
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
商场促销活动方案
2014/02/08 职场文书
《与象共舞》教学反思
2014/02/24 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
售后客服工作职责
2014/06/16 职场文书
俞敏洪一分钟演讲稿
2014/08/26 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
运动会100米加油稿
2015/07/21 职场文书
2016国庆促销广告语
2016/01/28 职场文书
《火烧云》教学反思
2016/02/23 职场文书
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python