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】B1004 成绩排名
简单题 循环输入放入结构体数组,一个sort搞定 #include <stdio.h> #include<algorithm> using namespace std; str ...
- win10安装nodejs遇到提示错误代码2503怎么办
我们在安装某个软件的时候,最闹心的就是遇到提示安装失败或错误,比如win10系统在安装nodejs遇到提示错误代码2503,遇见这个问题也不要慌张,今天小编就来告诉大家怎么解决这个问题. 1.打开智能 ...
- (转载)关于usr/bin/ld: cannot find -lxxx问题总结
usr/bin/ld: cannot find -lxxx问题总结 linux下编译应用程序常常会出现如下错误: /usr/bin/ld: cannot find -lxxx 意思是 ...
- Spring AOP 术语
- 推荐几本FPGA书籍(更新中)
1.<数字信号处理的FPGA实现>第三版 讲解比较详细的DSP理论,使用FPGA实现,不过使用VHDL语言:也颇具参考性. 2. <Xilinx Zynq-7000 嵌入式系统设计与 ...
- 阿里云短信服务调用例子-Python
阿里云短信服务调用例子 阿里云官方文档https://helpcdn.aliyun.com/document_detail/101893.html 首先需要安装阿里云PythonSDK(下面是pyth ...
- JAVA 容易忽略的东西
Java中的取余会出现负数.用Math.floorMod()方法可以掰正,但是也仅限被除数是负数的情况,如果除数是负数,这个没用. 和C不一样,Java中的字符串是不可变字符串,不能修改Java字符串 ...
- 【Linux基础】tr命令替换和删除字符
1.tr命令 tr可以对来自标准输入的字符进行替换.压缩和删除,可以将一组字符变成另外一组字符.通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能.您可以将 tr 看作为 sed 的(极其 ...
- 【vue】使用localStorage解决vuex在页面刷新后数据被清除的问题
通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...
- Python学习之函数进阶
函数的命名空间 著名的python之禅 Beautiful is better than ugly. Explicit is better than implicit. Simple is bette ...