Python學習筆記(十)多進程

參考資料:

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

今天就學習到這裏,下一節從多線程學起。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章