Python 中進程的知識點

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

 

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