Python学习笔记(十)多进程

时间:2021-11-15 04:19:33

参考资料:

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868322563729e03f6905ea94f0195528e3647887415000

1、多任务的实现有3种方式:

多进程模式;
多线程模式;
多进程+多线程模式。

2、Python实现多进程编程,有两种方式:

(1)调用操作系统的系统调用fork,在当前进程执行过程中创建子进程。但Windows操作系统下不支持fork调用。

import os

print 'Process (%s) start...' % os.getpid()
pid = os.fork()
if pid==0:
    print 'I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())
else:
    print 'I (%s) just created a child process (%s).' % (os.getpid(), pid)

(2)引用multiprocessing模块。通过该模块集成的Process类创建子进程。另外,通过os.getpid()可获取当前进程的ID。

3、通过multiprocessing模块中的Pool类可实现一次启动多个进程。实际同时执行的进程数取决于CPU内核个数。

4、Python的multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来实现进程间数据交换


下面是参考资料中给出的示例代码。

#示例代码1 Process类启动1个子进程
from multiprocessing import Process
import os
def run_proc(name):
    print "running process %s(%s) ..." % (name, os.getpid())

if __name__ == "__main__":
    print "Parent process %s" % os.getpid()
    p = Process(target = run_proc, args=('test', ))
    print "Process will start"
    p.start()
    p.join()
    print "Process end"
#示例代码2 进程池
from multiprocessing import Pool
import os, time, random

def long_time_task(name):
    print "Running 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()
    for i in range(5):
        p.apply_async(long_time_task, args=(i,))
    print "Waiting for all subprocess done ..."
    p.close()
    p.join()
    print "All subprocess done"
#示例代码3 进程间通过Queue实现通信
from multiprocessing import Process, Queue
import os, time, random

def write(q):
    for value in ['A', 'B', 'C']:
        print 'Put %s into the queue ...' % value
        q.put(value)
        time.sleep(random.random())

def read(q):
    while True:
        value = q.get(True)
        print 'Get %s from the queue.' % value

if __name__ == '__main__':
    q = Queue()
    pw = Process(target = write, args=(q,))
    pr = Process(target = read, args=(q,))
    pw.start()
    pr.start()
    pw.join()
    pr.terminate()

今天就学习到这里,下一节从多线程学起。