进程和线程的基本概念
线程是最小的执行单位,而进程由至少一个线程组成。
多任务的实现有3种方式:
* 多进程模式
* 多线程模式
* 多进程 + 多线程模式
多进程
multiprocessing模块就是跨平台版本的多线程模块。
multiprocessing模块提供了一个Process类来代表一个进程对象。下面的例子演示了启动一个子进程并等待其结束:
from multiprocessing import Process
import os
# 子进程要执行的代码
def run_proc(name):
print("Run child process %s (%s)...." % (name, os.getpid()))
if __name__ == "__main__":
print("Parent process %s." % os.getpid())
p = Process(target=run_proc, args=("test",))
print("Child process will start.")
p.start()
p.join()
print("Child process end .")
执行结果如下:
Parent process 5916.
Child process will start.
Run child process test (13504)....
Child process end .
创建子进程时, 只需传入一个执行函数和函数的参数, 创建一个Process实例, 用start()方法启动。
join()方法可以等待子进程结束后继续往下执行, 通常用于进程间的同步。
Pool
如果需要启动大量的子进程, 可以用进程池的方法批量创建子进程。
from multiprocessing import Pool
import os, time, random
def long_time_task(name):
print("Run task %s (%s)...." % (name, os.getpid()))
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print("Task %s runs %0.2f seconds." % (name, (end - start)))
if __name__ == "__main__":
print("Parent process %s." % os.getpid())
p = Pool(4)
for i in range(5):
p.apply_async(long_time_task, args=(i,))
print("Waiting for all subprocesses done...")
p.close()
p.join()
print("All subprocesses done...")
运行结果如下:
Parent process 6844.
Waiting for all subprocesses done...
Run task 0 (2420)....
Run task 1 (7392)....
Run task 2 (5396)....
Run task 3 (14276)....
Task 2 runs 0.83 seconds.
Run task 4 (