# 概述及进程创建

# 概述

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()