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程序与C++程序的联合使用
Apr 07 Python
Python中的hypot()方法使用简介
May 18 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
Mar 02 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
快速排序的四种python实现(推荐)
Apr 03 Python
java判断三位数的实例讲解
Jun 10 Python
python实现图片压缩代码实例
Aug 12 Python
Python操作qml对象过程详解
Sep 26 Python
windows下Python安装、使用教程和Notepad++的使用教程
Oct 06 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
Feb 19 Python
如何使用Tkinter进行窗口的管理与设置
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扩展函数
2006/10/09 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
2015/07/28 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
JavaScript 解析读取XML文档 实例代码
2009/07/07 Javascript
javascript getElementsByTagName
2011/01/31 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
js防刷新的倒计时代码 js倒计时代码
2017/09/06 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
jQuery实现输入框的放大和缩小功能示例
2018/07/21 jQuery
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
对python中GUI,Label和Button的实例详解
2019/06/27 Python
flask应用部署到服务器的方法
2019/07/12 Python
python paramiko远程服务器终端操作过程解析
2019/12/14 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
一个SQL面试题
2014/08/21 面试题
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
期末自我鉴定
2014/02/02 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
教你用eclipse连接mysql数据库
2021/04/22 MySQL
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
SQL注入的实现以及防范示例详解
2021/06/02 MySQL
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python