python线程安全及多进程多线程实现方法详解
进程和线程的区别
- 进程是对运行时程序的封装,是系统资源调度和分配的基本单位
- 线程是进程的子任务,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线程池模块ThreadPoolExecutor用法分析
本文实例讲述了Python线程池模块ThreadPoolExecutor用法.分享给大家供大家参考,具体如下: python3内置的有Threadingpool和ThreadPoolExecutor模块,两个都可以做线程池,当然ThreadPoolExecutor会更好用一些,而且也有ProcessPoolExecutor进程池模块,使用方法基本一致. 首先导入模块 from concurrent.futures import ThreadPoolExecutor 使用方法很简单,最常用的可能就
-
python线程池threadpool实现篇
本文为大家分享了threadpool线程池中所有的操作,供大家参考,具体内容如下 首先介绍一下自己使用到的名词: 工作线程(worker):创建线程池时,按照指定的线程数量,创建工作线程,等待从任务队列中get任务: 任务(requests):即工作线程处理的任务,任务可能成千上万个,但是工作线程只有少数.任务通过 makeRequests来创建 任务队列(request_queue):存放任务的队列,使用了queue实现的.工作线程从任务队列中get任务进行处理: 任务处理函
-
Python 多线程其他属性以及继承Thread类详解
一.线程常用属性 1.threading.currentThread:返回当前线程变量 2.threading.enumerate:返回一个包含正在运行的线程的list,正在运行的线程指的是线程启动后,结束前的状态 3.threading.activeCount:返回正在运行的线程数量,效果跟len(threading.enumer)一样 4.thr.setName:给线程设置名字 5.thr.getName:得到线程的名字. 举例: mport _thread as thread import
-
python time.sleep()是睡眠线程还是进程
python time.sleep()-睡眠线程还是进程? 它会阻止线程.如果查看Python源代码中的Modules / timemodule.c,您会看到在调用中floatsleep(),睡眠操作的实质部分包含在Py_BEGIN_ALLOW_THREADS和Py_END_ALLOW_THREADS块中,允许其他线程继续执行当前线程睡觉.你也可以用一个简单的python程序来测试它: import time from threading import Thread class worker(T
-
python多线程实现TCP服务端
本文实例为大家分享了python多线程实现TCP服务端的具体代码,供大家参考,具体内容如下 需求 1.创建一个TCP服务器接收服务端发送的信息并给予答复 2.以多线程方式实现接收客户端信息 3.间客户端发送的信息解码输出 思路分析 1.创建一个TCP客户端套接字 2.写一个接收消息的方法,可以接收客户端消息并解码输出 3.客户端被动监听,每有一个客户端连接就创建一个子线程执行接收消息方法 代码实现 # 导入模块 import socket import threading # 接收消息 def
-
详解python实现线程安全的单例模式
单例模式是一种常见的设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,服务器的配置信息写在一个文件中online.conf中,客户端通过一个 Config 的类来读取配置文件的内容.如果在程序运行期间,有很多地方都需要使用配置文件的内容,那么每个调用配置文件的地方都会创建 Config的实例,这就导致系统中存在多个Config 的实例对象,在配置文件内容很多的情况下,我们就浪费了大量的内存做了同样的事.事实上,
-
python多线程扫描端口(线程池)
扫描服务器ip开放端口,用线程池ThreadPoolExecutor,i7的cpu可以开到600个左右现成,大概20s左右扫描完65535个端口,根据电脑配置适当降低线程数 #!/usr/local/python3.6.3/bin/python3.6 # coding = utf-8 import socket import datetime import re from concurrent.futures import ThreadPoolExecutor, wait DEBUG = Fal
-
python线程安全及多进程多线程实现方法详解
进程和线程的区别 进程是对运行时程序的封装,是系统资源调度和分配的基本单位 线程是进程的子任务,cpu调度和分配的基本单位,实现进程内并发. 一个进程可以包含多个线程,线程依赖进程存在,并共享进程内存 什么是线程安全 一个线程的修改被另一个线程的修改覆盖掉. python中哪些操作是线程安全的 一个操作可以在多线程环境中使用,并且获得正确的结果. 线程安全的操作线程是顺序执行的而不是并发执行的. 一般涉及到写操作需要考虑如何让多个线程安全访问数据. 线程同步的方式 互斥量(锁): 通过互斥机制防
-
Python Process创建进程的2种方法详解
前面介绍了使用 os.fork() 函数实现多进程编程,该方法最明显的缺陷就是不适用于 Windows 系统.本节将介绍一种支持 Python 在 Windows 平台上创建新进程的方法. Python multiprocessing 模块提供了 Process 类,该类可用来在 Windows 平台上创建新进程.和使用 Thread 类创建多线程方法类似,使用 Process 类创建多进程也有以下 2 种方式: 直接创建 Process 类的实例对象,由此就可以创建一个新的进程: 通过继承 P
-
基于Python实现配置热加载的方法详解
目录 背景 如何实现 使用多进程实现配置热加载 使用signal信号量来实现热加载 采用multiprocessing.Event 来实现配置热加载 结语 背景 由于最近工作需求,需要在已有项目添加一个新功能,实现配置热加载的功能.所谓的配置热加载,也就是说当服务收到配置更新消息之后,我们不用重启服务就可以使用最新的配置去执行任务. 如何实现 下面我分别采用多进程.多线程.协程的方式去实现配置热加载. 使用多进程实现配置热加载 如果我们代码实现上使用多进程, 主进程1来更新配置并发送指令,任务的
-
linux下的C\C++多进程多线程编程实例详解
linux下的C\C++多进程多线程编程实例详解 1.多进程编程 #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main() { pid_t child_pid; /* 创建一个子进程 */ child_pid = fork(); if(child_pid == 0) { printf("child pid\n"); exit(0); } else { print
-
python 环境变量和import模块导入方法(详解)
1.定义 模块:本质就是.py结尾的文件(逻辑上组织python代码)模块的本质就是实现一个功能 文件名就是模块名称 包: 一个有__init__.py的文件夹:用来存放模块文件 2.导入模块 import 模块名 form 模块名 import * from 模块名 import 模块名 as 新名称 3. 导入模块本质 import 模块名 ===> 将模块中所有的数据赋值给模块名,调用时需要模块名.方法名() from 模块名 import 方法名 ==>将该方法单独放到当前文件运行一遍
-
对python numpy数组中冒号的使用方法详解
python中冒号实际上有两个意思:1.默认全部选择:2. 指定范围. 下面看例子 定义数组 X=array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]]) 输出为5x4二维数组 第一种意思,默认全部选择: 如,X[:,0]就是取矩阵X的所有行的第0列的元素,X[:,1] 就是取所有行的第1列的元素 第二种意思,指定范围,注意这里含左不含右 如,X[:, m:n]即取矩阵X的所有行中的的第m到n-1列数据,含左不含右
-
对python 匹配字符串开头和结尾的方法详解
1.你需要通过指定的文本模式去检查字符串的开头或者结尾,比如文件名后缀,URL Scheme 等等.检 查 字 符 串 开 头 或 结 尾 的 一 个 简 单 方 法 是 使 用str.startswith() 或 者 是str.endswith()方法.比如: >>> filename = 'spam.txt' >>> filename.endswith('.txt') True >>> filename.startswith('file:') Fa
-
对python xlrd读取datetime类型数据的方法详解
使用xlrd读取出来的时间字段是类似41410.5083333的浮点数,在使用时需要转换成对应的datetime类型,下面代码是转换的方法: 首先需要引入xldate_as_tuple函数 from xlrd import xldate_as_tuple 使用方法如下: #d是从excel中读取出来的浮点数 xldate_as_tuple(d,0) xldate_as_tuple第二个参数有两种取值,0或者1,0是以1900-01-01为基准的日期,而1是1904-01-01为基准的日期.该函数
-
对python 中class与变量的使用方法详解
python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding:utf-8 global_variable_1 = 'global_variable' class MyClass(): class_var_1 = 'class_val_1' # define class variable here def __init__(self, param): self
-
对Python发送带header的http请求方法详解
简单的header import urllib2 request = urllib2.Request('http://example.com/') request.add_header('User-Agent', 'fake-client') response = urllib2.urlopen(request) print request.read() 包含较多元素的header import urllib,urllib2 url = 'http://example.com/' headers
随机推荐
- JAVA实现多线程的两种方法实例分享
- 鼠标左键单击冲突的问题解决方法(防止冒泡)
- w3c编程挑战_初级脚本算法实战篇
- js运动动画的八个知识点
- .NET获取客户端的操作系统版本、浏览器版本和IP地址
- smarty巧妙处理iframe中内容页的代码
- php 无限级分类,超级简单的无限级分类,支持输出树状图
- 如何在旧的PHP系统中使用PHP 5.3之后的库
- 跟老齐学Python之做一个小游戏
- 利用C++简单实现顺序表和单链表的示例代码
- jsPDF导出pdf示例
- JavaScript 中 avalon绑定属性总结
- 浅析Go语言中的Range关键字
- Kosaraju算法详解
- Java 处理图片与base64 编码的相互转换的示例
- PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
- sql时间格式化输出、Convert函数应用示例
- Javascript中的作用域及块级作用域
- php删除二维数组中的重复值方法
- JavaScript碎片—函数闭包(模拟面向对象)