Python_线程、线程效率测试、数据隔离测试、主线程和子线程
0、进程中的概念
三状态:就绪、运行、阻塞
就绪(Ready):当进程已分配到除CPU以外的所有必要资源,只要获得处理机便可立即执行,这时的进程状态成为就绪状态.
执行/运行(Running)状态:当进程已获得处理机,其程序正在处理机上执行,此时的进程状态成为执行状态.
阻塞(Blocked)状态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态.引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等.
同步:一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。
异步:不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖他的任务无法确定,所以是不可靠的任务序列。
进程是计算机中最小的资源分配单位。
基础的进行开启:
import time
from multiprocessing import Process def f(name):
print('hello', name)
print('我是子进程') if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
time.sleep(1)
print('执行主进程了')
子进程的开启
D:\Python36\python.exe E:/Python/草稿纸.py
hello bob
我是子进程
执行主进程了 Process finished with exit code 0
结果
锁 —— 互斥锁
信号量 —— 锁 + 计数器
事件 —— Python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法set、wait、clear。
事件处理的机制:全局定义了一个‘Flag’,如果‘Flag’值为False,那么当程序event.wait方法时就会阻塞,如果'Flag'值为True,那么event,wait方法便不再阻塞.
clear:将'Flag'设置为False.
set:将'Flag'设置为True.
数据共享 Manager : dict、list
进程都在同一台计算机上才能用。
数据在进程之间不安全。
进程之间的数据共享 : 消息中间
memcache
rabbitmq
redis
队列:管道 + 锁
处理任意数据类型
进程之间的数据安全 —— 进程安全
管道:
有两端
需要关闭不用的所有端口,才会在recv处报错。
进程不安全。
进程池:
什么情况下要用进程池:
高CPU型的代码需要用进程池。
进程池设定 CPU个数 + 1
Pool池:
apply 同步
apply_async 异步提交
get 获取返回值
close
join
map
apply_async的简化版
它内部实现了close, join
但是没有get方法,无法接受返回值。
回调函数 apply_async(callback=???)
回调函数是在主进程中执行的
在子进程执行完任务之后立刻将结果返回给回调函数,被回调函数作为参数进行下一步的处理。
信号量和池
在同一时刻只会有n个进程在执行代码
相似?不同?
信号量是有多少任务开多少进程,信号量仍然给操作系统到来了很多负担。
池中进程的数量是固定的,只是分别借用池中的进程来执行任务而已。
1、线程
线程是计算机中能被CPU调度的最小单位。
进程是计算机中资源分配的最小单位。
多线程的特点:
并发;
轻量级;
数据不隔离。
多进程的特点:
并发的;
操作比较重;
数据完全隔离
2、线程效率测试
import os
import time
from threading import Thread # 线程 Tread def func():
for i in range(10):
print('in thread:', i, os.getpid())
time.sleep(0.5) if __name__ == '__main__':
t = Thread(target=func)
t.start()
time.sleep(1)
print('in main', os.getpid())
time.sleep(1)
print('in main 2', os.getpid())
效率测试
D:\Python36\python.exe E:/Python/草稿纸.py
in thread: 0 14936
in thread: 1 14936
in main 14936
in thread: 2 14936
in thread: 3 14936
in main 2 14936
in thread: 4 14936
in thread: 5 14936
in thread: 6 14936
in thread: 7 14936
in thread: 8 14936
in thread: 9 14936 Process finished with exit code 0
结果
3、数据隔离测试
未完待续。。。
4、主线程和子线程
未完待续。。。
Python_线程、线程效率测试、数据隔离测试、主线程和子线程的更多相关文章
- Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息
之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码: ...
- (转)C#/.NET主线程与子线程之间的关系
一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程. 有的博客上说“至少一个主线程”,这一说法持有怀疑 主线程与子线程之间的关系 ...
- C#/.NET主线程与子线程之间的关系
以前一直没有在程序中写过总结,再翻开程序时却不知所云,所以我决定写总结 一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程. 有的博客上说“至少 ...
- 在C#主线程和子线程将数据传递给对方如何实现
在C#中主线程和子线程怎样实现互相传递数据 老帅 在C#中创建线程Thread时,能够有多种方法,而主线程和子线程之间又怎样实现互相传递数据,每种创建方法传递參数的效果是不同的,逐一看一下: 一.不 ...
- C#主线程等待子线程运行结束
佐左佑右 原文 C#主线程等待子线程运行结束 由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然 ...
- UNIX环境高级编程——主线程与子线程的退出关系
我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下. 1. 主线程等待新线程先结束退出,主线程后退出.正常执行. 示例代码: #include & ...
- Java并发编程原理与实战六:主线程等待子线程解决方案
本文将研究的是主线程等待所有子线程执行完成之后再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { Sys ...
- Android线程之主线程向子线程发送消息
和大家一起探讨Android线程已经有些日子了,谈的最多的就是如何把子线程中的数据发送给主线程进行处理,进行UI界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发 ...
- [C#参考]主线程和子线程之间的参数传递
几个进程在大多数情况下要包含很多的子线程,那么他们之间免不了的要互相传递很多的参数,那么参数怎么传递的呢? 主线程向子线程传递参数的方法 第一种方法:Thraed类有一个带参数的委托类型的重载形式,这 ...
随机推荐
- Python常用的数据类型转换
在实际开发中.经常要根据需求来转变一些变量的类型. 需要用到以下函数:
- C语言 求两数的最大公约数和最小公倍数
//作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ #include<stdio.h> //最大公约数 int gys(int x,int ...
- 微信小程序多层嵌套循环,二级数组遍历
小程序中的遍历循环类似于angularJS的遍历. 二级数组遍历有一个坑.二级遍历wx:for循环的时候,需要注意.(代码如下) JS代码: data: { groups: [ [ { title: ...
- Java面试知识点之设计模式(一)
前言:关于设计模式,在框架中用的比较多.在平常接触最为频繁的估计是单例模式了,因此笔者在此对设计模式相关知识点进行总结. 1.设计模式的种类 总体来说,设计模式分为3大类总共23种: 1)创建型模式, ...
- tushare 开源数据包的使用
tushare 使用 python开源金融接口包: tushare.org/trading.html#d2 安装: pip install tushare import tushare as ts # ...
- vi/vim tab键空格数修改
更改Tap键单位 vi/vim编辑器默认情况下,每按一次Tap相对于8个空格. (1)临时性更改 使用vi打开文件后,输入如下命令: :set tabstop=4 命令释义:更改为相当于四个空格. ( ...
- Rancher学习笔记-----1.分享链接
http://blog.csdn.net/csdn_duomaomao/article/details/76156334
- BZOJ1095:[ZJOI2007]Hide 捉迷藏(动态点分治)
Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...
- PHP HMAC_SHA1 算法 生成算法签名
HMAC_SHA1(Hashed Message Authentication Code, Secure Hash Algorithm)是一种安全的基于加密hash函数和共享密钥的消息认证协议. 它可 ...
- 【Vuex】mapGetters 辅助函数
mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性: import { mapGetters } from 'vuex' export default { // ...