多任务解析

  • 什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。 现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行 多任务。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多 任务的呢?

  • 其实就是操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务 2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。 表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太 快了,我们感觉就像所有任务都在同时执行一样。

  • 真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多 于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核 心上执行。

多任务表现形式

  • window下打开任务管理器可以很清晰看到多个进程在同时执行任务,qq、微信等都是已进程的形式寄存在window下。大多我们在写一些控制台程序真正执行的时候都是以进程调度。

  • 在linux下以fork的形式创建进程,简单写个实例:

多次fork创建,进程数会已指数倍增长。

`
import os
import time num = 0
# 主进程创建了一个子进程
ret = os.fork()
if ret == 0:
num+=1
print('ret = 0,num=%d',num)
else:
time.sleep(1)
print('he,num=%d',num) # 主进程会再次创建一个子进程,上面的子进程也会创建一个子进程
ret = os.fork()
if ret ==0:
print('aaaaa')
else:
print('bbbb')
`

python中多进程

如果你打算编写多进程的服务程序,Unix/Linux无疑是正确的选择。由于Windows没有fork调用,由于Python是跨平台的,当然也应该提供一个跨平台的多进程支持。 multiprocessing模块就是跨平台版本的多进程模块。 multiprocessing模块提供了一个Process类来代表一个进程对象

进程池调度

- 每次指定几个进程同时执行任务

`
from multiprocessing import Pool
import os
import time def worker(num):
print('pid = %d,num = %d'%(os.getpid(),num))
time.sleep(2) pool = Pool(3) for i in range(10):
print('%d'%i)
pool.apply_async(worker,(i,)) pool.close()
pool.join() `
  • apply_async非阻塞式调度,apply阻塞式调度

进程间通讯

  • 任何进程间资源都是独立的,所有一切都是不可以共享的。实现资源共享、进程间通讯比较常用的方式就是Queue。

  • 使用Queue可以解决Process创建的进程之间的通讯,但是无法解决进程池中进程之间通讯。

  • 进程池进程之间的通讯需要使用Manager.Queue()创建的队列。

实现基于多进程的文件拷贝

`
# coding:utf-8 from multiprocessing import Pool,Manager
import os def CopyFile(oldPath,newPath,fileName,queue):
fr = open(oldPath+'/'+fileName)
fw = open(newPath+'/'+fileName,'w') # 当然如果是较大文件时,不要一次性读写
content = fr.read()
fw.write(content) fr.close()
fw.close() queue.put(fileName) def Main():
oldPath = input('please input folder path:')
newPath = oldPath+'-backups'
os.makedirs(newPath) fileNames = os.listdir(oldPath) pool = Pool(5)
queue = Manager().Queue() for name in fileNames:
pool.apply_async(CopyFile,args=(oldPath,newPath,name,queue)) num = 0
allNum = len(fileNames)
while num<allNum:
queue.get()
num += 1
copyRate = num/allNum
print('\r当前copy进度:%.2f%%'%(copyRate*100),end='') print('\n 已完成copy!') if __name__ == '__main__':
Main()
`

GitHub:基于多进程的文件拷贝

python多任务处理的更多相关文章

  1. 【python】迭代器&生成器

    源Link:http://www.cnblogs.com/huxi/archive/2011/07/01/2095931.html 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素 ...

  2. 提高Python运行效率的六个窍门

    曾灵敏 - MAY 18, 2015 Python是一门优秀的语言,它能让你在短时间内通过极少量代码就能完成许多操作.不仅如此,它还轻松支持多任务处理,比如多进程. 不喜欢Python的人经常会吐嘈P ...

  3. Python生成器与yield

    列表推导与生成器表达式 当我们创建了一个列表的时候,就创建了一个可以迭代的对象: >>> squares=[n*n for n in range(3)] >>> f ...

  4. 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!

    本文参考:http://www.dabeaz.com/coroutines/   作者:David Beazley 缘起: 本人最近在学习python的协程.偶然发现了David Beazley的co ...

  5. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

  6. 深入理解 GIL:如何写出高性能及线程安全的 Python 代码

    深入理解 GIL:如何写出高性能及线程安全的 Python 代码 本文由 伯乐在线 - 郑芸 翻译.未经许可,禁止转载!英文出处:A. Jesse.欢迎加入翻译组. GIL对多线程的影响:http:/ ...

  7. 提高你的python:解释 yield 和 Generators(生成器)

    转自:http://www.oschina.net/translate/improve-your-python-yield-and-generators-explained 原文:http://www ...

  8. python 全栈开发,Day119(Flask初识,Render Redirect HttpResponse,request,模板语言 Jinja2,用户登录例子,内置Session)

    一.Flask初识 首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 三大主流Web框架对比 ...

  9. Python 的并发编程

    这篇文章将讲解 Python 并发编程的基本操作.并发和并行是对孪生兄弟,概念经常混淆.并发是指能够多任务处理,并行则是是能够同时多任务处理.Erlang 之父 Joe Armstrong 有一张非常 ...

随机推荐

  1. Java之基本类库学习

    JAVA基本类库: (一),输入相关 main(String[] args):设置输入参数 输入类:Scanner:Scanner sc=new Scanner(System.in); (二),系统相 ...

  2. 用Fiddler或Charles进行mock数据搭建测试环境

    转载:http://blog.csdn.net/qqYJ5/article/details/62216582 应用场景:服务器数据不符合测试条件或者服务器未开发完成时,我们可以通过在本地创建数据来达到 ...

  3. 倍福TwinCAT(贝福Beckhoff)基础教程5.1 TwinCAT-2 运行可执行文件

    个人认为这条命令做的参数比较混乱,PATHSTR是指可执行文件路径+最终文件名,DIRNAME是指可执行文件路径,最后COMNDLINE可有可无,是指带参数运行启动的文件   测试可以正常运行     ...

  4. 倍福TwinCAT(贝福Beckhoff)基础教程4.2 TwinCAT如何读写CSV文件

    本程序只是在官方范例程序上稍作修改,在官方原有的范例中,演示了多种模式的读写(可以认为CSV文件是比TXT文件需要更多数据量的时候使用,比如记录一个小型的数据库集合)   但是写的比较混乱,甚至没有H ...

  5. Centos修改文件打开数限制

    一.查看系统限制最大打开数 cat /proc/sys/fs/file-max 还有一个问题是file-max最大能设置多大呢?一个经验算法是 256个fd 需4M内存.例如8G内存,8*1024/4 ...

  6. red5截屏

    在red5-web.xml添加 <bean id="rtmpSampleAccess" class="org.red5.server.stream.RtmpSamp ...

  7. d3系列2--api攻坚战05

    今天的内容相比之前的就有点儿难了?怂了没? 别问我为什么不讲详细内容,你写十遍自己就清楚究竟是怎么回事了,画画的事儿还是得动笔动键盘. 先看看效果图 事实上假设用笨办法一条一条画的话.也不难. 可是设 ...

  8. 计算两个有序数组的第K大数(转)

    传统解法,最直观的解法是O(m+n).直接merge两个数组,然后求第K大的数字. 如果想要时间复杂度将为O(log(m+n)).我们可以考虑从K入手.如果我们每次能够删除一个一定在第K个元素之前的元 ...

  9. Servlet的API(一)

    Servlet的API有很多,这里只谈谈两个Servlet对象:ServletConfig对象和ServletContext对象. 1. ServletConfig对象 在Servlet的配置文件中, ...

  10. svn上传代码时出现:Authorization failed

    出现该问题基本都是三个配置文件的问题,下面把这个文件列出来 svnserve.conf:[general]anon-access = readauth-access = writepassword-d ...