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类有一个带参数的委托类型的重载形式,这 ...
随机推荐
- 【PAT】B1005 继续(3n+1)猜想
没有婼姐写得好 将所有的输入放入mp,mp2 覆盖的数存入mp 一开始认为mp中只出现一次的元素就是,忘了可能只被覆盖一次的情况 所以添加了mp2保存输入 #include <iostream& ...
- June 14. 2018 Week 24th Thursday
Good friends, good books, and a sleepy conscience: this is the ideal life. 拥有益友.良书和一颗宁静的内心:这就是理想的生活. ...
- Java访问级别修饰符
用途 控制其他类可以访问的字段或方法 修饰符 public.protected.no modifier(未声明).private 访问级别 修饰符 当前类 包 子类 其他包 public √ √ √ ...
- 【HNOI2018】排列
[HNOI2018]排列 神仙贪心题. 题目说这么大堆东西就是想告诉你这是个森林,选了\(v\)的父亲后才能选\(v\). 我们设\(w_v\)为\(v\)所在联通块权值和,\(size_v\)表示\ ...
- 「APIO2017」商旅
「APIO2017」商旅 题目描述 在广阔的澳大利亚内陆地区长途跋涉后,你孤身一人带着一个背包来到了科巴.你被这个城市发达而美丽的市场所深深吸引,决定定居于此,做一个商人.科巴有 \(N\) 个集市, ...
- range()函数
range()函数 函数说明: range(start, stop[, step]) -> range object,根据start与stop指定的范围以及step设定的步长,生成一个序列.参数 ...
- 深度学习框架PyTorch一书的学习-第三章-Tensor和autograd-1-Tensor
参考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的网址去查看代码,下面是本人的笔记 Tensor Tensor可以是一个数 ...
- pg安装入门
1.下载源码安装包 [root@test2019030517 ~]# wget https://ftp.postgresql.org/pub/source/v10.5/postgresql-10.5. ...
- 获取数值型数组的最大值和最小值,使用遍历获取每一个值,然后记录最大值和最小值的方式。(数组遍历嵌套if判断语句)
package com.Summer_0420.cn; /** * @author Summer * .获取数值型数组的最大值.最小值 * 方法:遍历获取每一个值,记录最大值: * 方法:遍历获取每一 ...
- syzkaller 资料集合
搭建 1.Setup: Ubuntu host, QEMU vm, x86-64 kernel https://github.com/google/syzkaller/blob/master/docs ...