參考資料:
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()
今天就學習到這裏,下一節從多線程學起。