python爬蟲學習筆記--python多進程

使用multiprocessing模塊創建多進程:
import os
from multiprocessing import Process

#子進程要執行的代碼
def run_proc(name):
    print('Child process %s (%s)Running...' %(name,os.getpid()))
    
if __name__=='__main__':
    print('Parent poecess %s.' % os.getpid())
    for i in range(5):
        p=Process(target=run_proc,args=(str(i),))
        print('Process will start.')
        p.start()
    p.join()
    print('Process end.')

執行效果:


使用multiprocessing模塊中的Pool類代表進程池對象:

    Pool可以提供指定數量的進程供用戶調用,默認大小是CPU的核數。

from multiprocessing import Pool
import os,time,random

def run_task(name): 
    print('Task %s (pid=%s) is running...' % (name,os.getpid())) 
    time.sleep(random.random()*3) 
    print('Task %s end.' % name)
	
	
if __name__=='__main__': 
    print('Current process %s.' % os.getpid()) 
    p=Pool(processes=3)#指定創建進程池大小爲3,用p=Pool()則進程池大小爲CPU核數 
    for i in range(5): 
        p.apply_async(run_task,args=(i,)) 
    print('Wating for all subprocess done...') 
    p.close() 
    p.join() 
    print('All subprocesses done.')


執行效果:

進程間通信:

Queue通信方式

from multiprocessing import Process,Queue
import os,time,random

#寫數據進程執行的代碼
def proc_write(q,urls):
    print('Process(%s) is writing...' % os.getpid())
    for url in urls:
        q.put(url)
        print('Put %s to queue...' % url)
        time.sleep(random.random())
        
#讀數據進程執行的代碼
def proc_read(q):
    print('Process (%s) is reading...' % os.getpid())
    while True:
        url=q.get(True)
        print('Get %s from queue.' % url)

if __name__=='__main__':
    #父進程創建Queue,並傳給各個子進程
    q=Queue()
    proc_writer1=Process(target=proc_write,args=(q,['url_1','url_2','url_3']))
    proc_writer2=Process(target=proc_write,args=(q,['url_4','url_5','url_6']))
    proc_reader=Process(target=proc_read,args=(q,))
    #啓動子進程proc_writer寫入
    proc_writer1.start()
    proc_writer2.start()
    #啓動子進程proc_read讀取:
    proc_reader.start()
    #等待proc_writer結束:
    proc_writer1.join()
    proc_writer2.join()
    #proc_read進程裏是死循環,無法等待其結束,只能強行終止
    proc_reader.terminate()

執行效果:



發佈了13 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章