进程
- 进程就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每一个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据。操作系统管理所有进程的执行,为进程合理分配资源。进程可以通过fork或spawn的方式来创建新的进程来执行其他的任务,不过新的进程也有自己独立的内存空间,因此必须通过进程间通信机制(IPC,Inter-Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存区等。
- 线程就是一个进程中多个并发的执行线索,拥有多个可以获得CPU调度的执行单元。线程相比于进程,因为线程在同一个进程下,他们之间共享上下文,所以线程间的信息共享和通信更加容易。在单核的cpu种并发是不能真正的实现,在具体的时刻能够获得CPU的只有唯一的一个线程,他们是时间共享CPU。通过任务管理器就可以看到进程。Python支持多进程又支持多线程,因此使用Python实现并发编程主要有3种方式:多进程、多线程、多进程+多线程
python中的多进程
Unix和Linux操作系统上提供了fork()系统调用来创建进程,调用fork()函数的是父进程,创建出的是子进程,子进程是父进程的一个拷贝,但是子进程拥有自己的PID。fork()函数非常特殊它会返回两次,父进程中可以通过fork()函数的返回值得到子进程的PID,而子进程中的返回值永远都是0。Python的os模块提供了fork()函数。由于Windows系统没有fork()调用,因此要实现跨平台的多进程编程,可以使用multiprocessing模块的Process类来创建子进程,而且该模块还提供了更高级的封装,例如批量启动进程的进程池(Pool)、用于进程间通信的队列(Queue)和管道(Pipe)等。
举个例子:
这个例子运行时时一个一个方法执行,我们用多进程的方法来使用。
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_download = randint(5