1、进程是指在系统中正在运行的一个应用程序,程序一旦运行就是进程。
2、进程是系统进行资源分配的独立实体, 且每个进程拥有独立的地址空间。
3、一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。
使用多进程示例:
from random import randint from time import time, sleep from multiprocessing import Process def download_task(filename): print('开始下载%s...' % filename) time_to_download = randint(5, 10) sleep(time_to_download) print('%s下载完成! 耗费了%d秒' % (filename, time_to_download)) def main2(): start = time() p1 = Process(target=download_task,args=("Pytho测试开发入门到精通.pdf",)) p1.start() p2 = Process(target=download_task, args=("Peking Hot.avi",)) p2.start() p1.join() p2.join() end = time() print('总共耗费了%.2f秒.' % (end - start)) if __name__ == '__main__': main2()
运行结果:
两个任务同时执行,总耗时不再是两个任务的时间总和
多线程是指从软件或者硬件上实现多个线程的并发技术
使用多线程示例(推荐 threading 模块来实现多线程编程):
#!/usr/bin/env python from random import randint from threading import Thread from time import time, sleep def download_task(filename): print('开始下载%s...' % filename) time_to_download = randint(5, 10) sleep(time_to_download) print('%s下载完成! 耗费了%d秒' % (filename, time_to_download)) def main3(): start = time() p1 = Thread(target=download_task,args=("Python从入门到住院.pdf",)) p1.start() p2 = Thread(target=download_task, args=("Peking Hot.avi",)) p2.start() p1.join() p2.join() end = time() print('总共耗费了%.2f秒.' % (end - start)) if __name__ == '__main__': main3()
执行结果:
协程(coroutine)可以理解为是线程的优化,又称之为轻量级进程。它是一种比线程更节省资源、效率更高的系统调度机制。一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。
1、在同时开启的多个任务中,一次只执行一个,只有当前任务遭遇阻塞,才会切换到下一个任务继续执行。这种机制可以实现多任务的同步,又能够成功地避免线程中使用锁的复杂性,简化了开发。
2、极高的执行效率
这里以 asyncio 为例,先来了解一下创建协程所用到的概念:
使用协程示例:
import asyncio from random import randint from time import time, sleep #定义协程处理函数 async def download_task(filename): print('开始下载%s...' % filename) time_to_download = randint(5, 10) await asyncio.sleep(time_to_download) print('%s下载完成! 耗费了%d秒' % (filename, time_to_download)) #生成协程对象,并传入下载文件 coroutine = download_task("Python从入门到住院.pdf") coroutine1 = download_task("Peking Hot.avi") loop=asyncio.get_event_loop() #获得事件循环对象 try: start = time() #将协程注册到实现时间循环对象中,并开始运行 loop.run_until_complete(coroutine) loop.run_until_complete(coroutine1) end = time() print('总共耗费了%.2f秒.' % (end - start)) finally: loop.close()
执行结果:
上面的代码体现了实现协程的基本步骤:
应根据业务需要来灵活运用线程或协程或进程。首选多进程+协程的方式。