【Python】多進程1

一、    進程定義:html

(1) 進程是一個實體。每一個進程都有他本身的地址空間,通常包括文本區域、數據區域和堆棧。進程是線程的容器。併發

(2) 進程是一個「執行中的程序」app

二、    進程的特徵:異步

(1) 動態性async

(2) 併發性分佈式

(3) 獨立性函數

(4) 異步性:同步:順序執行,不可跳躍  異步:並行url

(5) 結構特徵:進程由程序、數據和進程控制塊(PCB,存進程相關的信息,好比進程ID,父ID,狀態)三部分組成spa

(6) 多個不一樣的進程能夠包含相同的程序線程

三、    CPU組成:運算器、控制器和寄存器

四、    進程切換:從正在運行的進程中收回處理器,而後再使待運行進程來佔用處理器

五、    進程的上下文:進程切換時被存儲在寄存器中打包的中間數據

六、    進程運行狀態:

(1) 就緒狀態

(2) 運行狀態

(3) 阻塞狀態:因爲進程等待某種條件(如 I/O 操做或進程同步),在條件未知足以前沒法執行

七、    分庫、分秒、分佈式計算、分佈式索引、異步進程

八、    同步、異步、阻塞、非阻塞

九、    程序計數器:program counter 程序運行到哪一行

十、   Python中一些進程模塊

(1) os.fork()

(2) subprocess

(3) processing

(4) Multiprocessing

十一、   os.fork()

在Linux中,執行fork函數後,父進程拿到的fork函數返回值是子進程的pid,子進程拿到的fork函數返回值是0,父進程和子進程會分別執行後續未執行的代碼.換了意思:子進程永遠返回0,而父進程返回子進程的ID。

十二、    進程池pool的一些方法:

(1) apply()

(2) map()

(3) close()

(4) terminate()

(5) apply_async()只能執行一個

1三、    線程比進程快的緣由:線程依附於進程,但他快的緣由是不不涉及到上下文PCB那些東西

1四、    Pool.map和六件客map的區別:pool.map用的是多進程,map是單進程

1五、    隊列:Queue,此隊列跟進程中的消息隊列不一樣

Q.put()

Q.full()判斷隊列是否滿了

Q.qsize()判斷隊列的大小

Q.empty()判斷隊列是否爲空

Q.get(True,2)等待超時時間2秒,設置True後若是等待2秒後尚未數值返回就結束;False表示等2秒後若是沒有值拋異常;若是什麼都不寫,會死等

調用隊列對象的get()方法從隊頭刪除並返回一個項目。可選參數爲block,默認爲True。若是隊列爲空且block爲True,get()就使調用線程暫停,直至有項目可用。若是隊列爲空且block爲False,隊列將引起Empty異常

 

 

#練習:最簡單的多進程模型

import multiprocessing
def do(n) :
  #獲取當前線程的名字
  name = multiprocessing.current_process().name
  print name,'starting'
  print "worker ", n
  return 

if __name__ == '__main__' :
  numList = []
  for i in xrange(5) :
    p = multiprocessing.Process(target=do, args=(i,))
    numList.append(p)
    p.start()
    p.join()
    print "Process end."
  print numList



#練習:三個進程,每一個進程寫一個文件,每一個文件中有進程的名字和當前日期

import time
import multiprocessing
import os

def write(file):
    name=multiprocessing.current_process().name
    with open(file,"w") as f:
        f.write(name+":"+time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
    return

if __name__=="__main__":
    for i in range(3):
        file_path = os.path.join("e:\\test4",str(i)+".txt")
        p = multiprocessing.Process(target=write, args=(file_path,))  #參數是個元組,因此必須有個逗號
        p.start()
        p.join()


#練習:多進程模板
import multiprocessing
import urllib2 
import time

def func1(url) :
  response = urllib2.urlopen(url) 
  html = response.read()
  print html[0:50]
  time.sleep(2) 

def func2(url) :
  response = urllib2.urlopen(url) 
  html = response.read()
  print html[0:50]
  time.sleep(2)

 
if __name__ == '__main__' :
    p1 = multiprocessing.Process(target=func1,args=("http://www.sogou.com",),name="g1")
    p2 = multiprocessing.Process(target=func2,args=("http://www.baidu.com",),name="g2")
    p1.start()
    p2.start()
    p1.join()  #加了join是等全部子進程都執行完後纔會打印done,若是不加join,會先打印done,但子進程依然會執行
    p2.join()
    time.sleep(2)
    print "done!"
相關文章
相關標籤/搜索