Python学习之旅(二十三)
Python基础知识(22):进程和线程(Ⅰ)
1、多进程
(1)fork
Python的os
模块封装了常见的系统调用,其中就包括fork
,可以在Python程序中轻松创建子进程
fork可以在Mac的Python上运行,但无法再Windows下运行
(2)multiprocess
multiprocessing
模块就是跨平台版本的多进程模块
multiprocessing
模块提供了一个Process
类来代表一个进程对象
#process_1.py from multiprocessing import Process
import os def work(name):
print("Run child process %s(%s)..." %(name,os.getpid())) if __name__=="__main__":
print("Parent process %s." % os.getpid())
#创建进程实例
p = Process(target=work, args=("test",))
print("Child process will start...")
p.start()
p.join()
print("Child process end.") 结果:
Parent process 14628.
Child process will start...
Child process end.
创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process
实例,用start()
方法启动,join()
方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步
(3)pool
用进程池的方式批量创建子进程,启动大量的子进程
#process_2.py from multiprocessing import Pool
import os, time, random def long_time_task(name):
print("Run task %s(%s)..." %(name,os.getpid()))
start=time.time()
time.sleep(random.random()*3)
end=time.time()
print("Task &s runs %0.2f seconds." %(name,(end - start))) if __name__=="__main__":
print("Parent process %s." % os.getpid())
p = Pool(2)
for i in range(3):
p.apply_async(long_time_task, args=(i,))
print("Waiting for all subprocess done...")
p.close()
p.join()
print("All subprocess done") 结果:
Parent process 2096.
Waiting for all subprocess done...
All subprocess done
Pool
的默认大小是CPU的核数,此次运行环境cup核数为1
(4)子进程
subprocess
模块可以让我们非常方便地启动一个子进程,然后控制其输入和输出
#process_3.py import subprocess print("$ nslookup www.python.org")
r = subprocess.call(["nslookup", "www.python.org"])
print("Exit code:", r) 结果:
$ nslookup www.python.org
Exit code: 0
如果子进程还需要输入,则可以通过communicate()
方法
(5)进程间通信
Python的multiprocessing
模块包装了底层的机制,提供了Queue
、Pipes
等多种方式来交换数据
#process_4.py from multiprocessing import Process, Queue
import os, time, random def write(q):
print("Process to write: %s" %os.getpid())
for value in ["A","B","C"]:
print("Put %s to queue..." % value)
q.put(value)
time.sleep(random.random()) def read(q):
print("Process to read: %s" % os.getpid())
while True:
value = q.get(True)
print("Get %s from queue." % value) if __name__=="__mainn__":
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
pw.start()
pr.start()
pw.join()
pr.terminate()
二、多线程
多任务可以由多进程完成,也可以由一个进程内的多线程完成
进程是由若干线程组成的,一个进程至少有一个线程
Python的标准库提供了两个模块:_thread
和threading
,_thread
是低级模块,threading
是高级模块,对_thread
进行了封装
绝大多数情况下,我们只需要使用threading
这个高级模块
import time, threading def work():
n = 1
while n < 6:
print("Work %s is running..." % str(n))
n+=1 t = threading.Thread(target = work, name = "workThread")
t.start()
t.join()
print("%s ended." % threading.current_thread().name) 结果:
Work 1 is running...
Work 2 is running...
Work 3 is running...
Work 4 is running...
Work 5 is running...
MainThread ended.
由于任何进程默认就会启动一个线程,我们把该线程称为主线程,主线程又可以启动新的线程,Python的threading
模块有个current_thread()
函数,它永远返回当前线程的实例
主线程实例的名字叫MainThread
,子线程的名字在创建时指定,名字仅仅在打印时用来显示,完全没有其他意义,如果不起名字Python就自动给线程命名为Thread-1
,Thread-2
……
LOCK
线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改
线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了
当某个进程要更改数据时,先给它上锁,其它线程不能更改。只有当锁被释放后,其它线程获得该锁以后才能改
由于锁只有一个,无论多少线程,同一时刻最多只有一个线程持有该锁,所以,不会造成修改的冲突
多核CPU
Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响
Python学习之旅(二十三)的更多相关文章
- Python学习之旅(十三)
Python基础知识(12):函数(Ⅲ) 高阶函数 1.map map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterat ...
- python学习笔记(二十三)私有方法和私有属性
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Person类的定义来看,外部代码还是可以自由地修改一个实例的nam ...
- 180分钟的python学习之旅
最近在很多地方都可以看到Python的身影,尤其在人工智能等科学领域,其丰富的科学计算等方面类库无比强大.很多身边的哥们也提到Python非常的简洁方便,比如用Django搭建一个见得网站只需要半天时 ...
- Python学习笔记(二)——列表
Python学习笔记(二)--列表 Python中的列表可以存放任何数据类型 >>> list1 = ['Hello','this','is','GUN',123,['I','Lov ...
- python学习02python入门二
学前须知:1.本文档有关内容均建立在python3.x版本上,python2.x已经成为历史,如有需要,文内会特别说明. 2.本文使用的编辑器多为架构在Windows上的pycharm,如需了解Lin ...
- 【Python学习笔记之二】浅谈Python的yield用法
在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...
- Python学习笔记(二):条件控制语句与循环语句及常用函数的用法
总结的内容: 1.条件控制语句 2.while循环语句 3.for循环语句 4.函数的用法 一.条件控制语句 1.介绍 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决 ...
- Python学习系列(二)(基础知识)
Python基础语法 Python学习系列(一)(基础入门) 对于任何一门语言的学习,学语法是最枯燥无味的,但又不得不学,基础概念较繁琐,本文将不多涉及概念解释,用例子进行相关解析,适当与C语言对比, ...
- 滴滴Booster移动APP质量优化框架 学习之旅 二
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分 ...
- python学习之旅
python学习分类 python基础 +- day01——python初始.变量.常量.注释.基础数据类型.输入.if day02——while.字符串格式化.运算符.编码初识 day03—— ...
随机推荐
- Docker搭建镜像仓库和配置缓冲地点
Docker搭建镜像仓库和配置缓冲地点 参考网址:https://docs.docker.com/engine/reference/commandline/dockerd/#options 一.配置D ...
- TensorFlow实战Google深度学习框架1-4章学习笔记
目录 第1章 深度学习简介 第2章 TensorFlow环境搭建 第3章 TensorFlow入门 第4章 深层神经网络 第1章 深度学习简介 对于许多机器学习问题来说,特征提取不是一件简单的事情 ...
- 在Ubuntu18.04下配置hadoop集群
服务器准备 启动hadoop最小集群的典型配置是3台服务器, 一台作为Master, NameNode, 两台作为Slave, DataNode. 操作系统使用的Ubuntu18.04 Server, ...
- 文档大师 在Win10 IE11下,文档集画面无法正常显示Word等Office文档的解决方法
在文档集界面中显示Word文档,是文档大师的一个核心功能. 最近在 Win10 升级到最新版后,发现 无法正常显示Office 文档的问题. 一开始以为是Word版本问题,从2007升级到2016,问 ...
- FastDFS常用命令
1.启动FastDFS tracker: /usr/local/bin/fdfs_trackered %FastDFS%/tracker.conf storage: /usr/local/bin/fd ...
- Java多线程系列——从菜鸟到入门
持续更新系列. 参考自Java多线程系列目录(共43篇).<Java并发编程实战>.<实战Java高并发程序设计>.<Java并发编程的艺术>. 基础 Java多线 ...
- 【转载】基于rasa的对话系统搭建(上)
文章介绍使用rasa nlu和 rasa core 实现一个电信领域对话系统demo,实现简单的业务查询办理功能,更完善的实现需要进一步数据的收集.demo基于玩具数据集,可以达到下面的效果: Bot ...
- CAS单点登陆,URL多出个参数jsessionid导致登陆失败问题
目录: 1.定位问题 2.问题产生的原因 3.解决问题 一 定位问题 首先,如下图所示:输入到地址栏的地址被302重定向到单点登录地址,地址由Response Headers中的参数Location所 ...
- 搞明白GOROOT,GOPATH,GOBIN,project目录
我们接下来一个一个来看关于Go语言中的三个目录的详细解释先通过go env查看go的环境变量(我这里是mac的环境,所以可能和你的不同) localhost:~ zhaofan$ go env GOA ...
- mysql 表分区技术
表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分.从逻辑上看,只有一张表,但是底层却是由多个物理分区组成. 表分区有什么好处: a.分区表的数据可以分布在不同的物理设备上, ...