# 概述及进程创建
# 概述
multiprocessing是一个用与 threading 模块相类似API的支持产生进程的包。 multiprocessing包同时提供本地和远程并发,使用子进程代替线程,有效避免 Global Interpreter Lock 带来的影响。因此, multiprocessing模块允许程序员充分利用机器上的多个核心。Unix和 Windows上都可以运行。
同时,multiprocessing还支持threading模块所不支持的Pool对象。
# 上下文和启动方法
# fork()-Linux系统
- Linux或者Unix操作系统都提供了fork()函数来创建进程,调用fork()函数的是父进程,创建出的是子进程,子进程是父进程的一个拷贝,但拥有自己的PID。
- 子进程复制父进程的所有的数据空间,拥有自己独立的内存空间-因此通过全局变量的形式实现进程间通信是不可行的。
- fork()函数会返回两次,父进程通过fork()函数获得子进程PID,子进程通过fork()获得的永远是0.
- Python的os模块提供了fork()函数,但注意windows下没有fork()调用
# Process-多进程
- 可以使用multiprocessing模块的Process类创建子进程
- Pool提供批量启动进程的进程池
- Queu和Pipe提供用于进程间通信的队列
# Process
from multiprocessing import Process
from os import getpid
from random import randint
from time import time, sleep
def download_task(filename):
print('启动下载进程,进程号[%d].' % getpid())
print('开始下载%s...' % filename)
time_to_download = randint(5, 10)
sleep(time_to_download)
print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))
def main():
start = time()
p1 = Process(target=download_task, args=('Python从入门到住院.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__':
main()