1.什麼是進程(process)和什麼是線程(thread)
a.進程是操作系統分配資源的最小單元,而線程是操作系統調度的最小單元
b.一個應用程序最少包含1個進程,而一個進程包含一個或者多個線程,線程尺度更小
c.每個線程在執行過程中擁有獨立的內存單元,而一個進程的多個線程在執行過程中共享內存
2.開始寫一個帶process的function
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
from multiprocessing import Process
def task(name):
print 'child process'
print name
print os.getpid()
if __name__=='__main__':
print '-------'
p = Process(target = task, args=('test',))
p.start()
p.join()
print 'process end'
3.寫一個帶process的class:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import multiprocessing
import os
from multiprocessing import current_process
class Work(multiprocessing.Process):
def run(delf):
name = current_process().name
print name,os.getpid()
print delf.name
return
if __name__=='__main__':
print '-------',os.getpid()
p = Work()
p.start()
p.join()
print 'process end'
4.啓動多個進程
import multiprocessing
import os
def worker(num):
print 'Worker:', num+1 , os.getpid()
return
if __name__ == '__main__':
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
jobs.append(p)
p.start()#啓動進程
5.進程中關於terminate()結束子進程,但是會導致子進程的資源無法釋放掉,是不推薦的做法,因爲結束的時候不清楚子線程的運行狀況,有很大可能性導致子線程在不恰當的時刻被結束。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import multiprocessing
import time
import os
def worker():
print 'ddddddd starting'
time.sleep(1)
print 'finsh'
#terminate()結束子進程,但是會導致子進程的資源無法釋放掉
if __name__=='__main__':
p = multiprocessing.Process(target = worker)
print 'zhixingqian',p.is_alive()
p.start()
print 'zhong',p.is_alive()
p.terminate()#發送停止信號
print 'ting',p.is_alive()
p.join()
print 'end',p.is_alive()
6.多進程的啓動
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import random
import time
from multiprocessing import Pool, current_process
from time import ctime
def task(name):
print 'start task' ,name, os.getpid()
start = time.time()
time.sleep(random.random() * 3)
print 'end task ' ,name, (time.time() - start)
return current_process().name + 'done'
if __name__ == '__main__':
print 'parent process',os.getpid()
result = []
p = Pool() # 初始化進程池
for i in range(5):
result.append(p.apply_async(task, args=(i,))) # 追加任務 apply_async 是異步非阻塞的,就是不用等待當前進程執行完畢,隨時根據系統調度來進行進程切換。
p.close()
p.join() # 等待所有結果執行完畢
for res in result:
print res.get() # get()函數得出每個返回結果的值
print 'all done at:', {ctime()}