multiprocessing的多程序爬蟲

2021-10-08 14:33:59 字數 3726 閱讀 7833

multiprocessing對於習慣使用threading多執行緒的使用者非常友好,因為它的理念是像執行緒一樣管理程序,和

threading很像,而且對於多核cpu的利用率比 threading高得多。當程序數量大於cpu的核心數量時,等待執行的程序會等到其他程序執行完畢讓出核心為止。因此,如果cpu是單核,就無法進行多程序並行。在使用多程序爬蟲之前,我們需要先了解計算機cpu的核心數量。

這裡用到了 multiprocessing:

from multiprocessing import cpu_count

print

(cpu_count(

))

執行上述**,得到的結果是6,也就

是本機的cpu核心數為6

在這裡使用3個程序,**如下:

from multiprocessing import process, queue

import time

import requests

link_list =

with

open

('alexa.txt'

,'r')as

file

: file_list =

file

.readlines(

)for each in file_list:

link = each.replace(

'\n',''

)class

myprocess

(process)

:def

__init__

(self, q)

: process.__init__(self)

self.q = q

defrun(self)

:print

("starting "

, self.pid)

while

not self.q.empty():

self.crawler(self.q)

print

("exiting"

, self.pid)

defcrawler

(self, q)

: url = q.get(timeout=2)

try:

r = requests.get(url, timeout=20)

print

(q.qsize(

), r.status_code, url)

except exception as e:

print

(q.qsize(

), url,

'error:'

, e)

if __name__ ==

'__main__'

: workqueue = queue(

1010

) start = time.time(

)# 填充佇列

for url in link_list:

print

(url)

workqueue.put(url)

print

(workqueue)

for i in

range(3

):p = myprocess(workqueue)

p.daemon =

true

p.start(

) p.join(

) end = time.time(

)print

('process+ queue多程序爬蟲的總時間為:'

, end - start)

print

('main process ended!'

)

在上述**中,使用 multiprocessing的方式基本和 thread庫類似。首先使用:from multiprocessing import

process, queue匯入 multiprocessing庫。值得注意的是,在 thread多執行緒中用來控制佇列的

queue庫, multiprocessing自帶了。和thread類似的是,在讀取鏈結列表後建立了 myprocess這個類,變數是 workqueue佇列。該類的其他部分基本與 thread多執行緒類似。我們繼續使用迴圈來新增程序,與多執行緒不同的是,在多程序中設定了daemono p. daemon=true,在多程序中,每個程序都可以單獨設定它的屬

性,如果將 daemon設定為true,當父程序結束後,子程序就會自動被終止。

from multiprocessing import pool, manager

import time

import requests

link_list =

with

open

('alexa.txt'

,'r')as

file

: file_list =

file

.readlines(

)for each in file_list:

link = each.replace(

'\n',''

)def

crawler

(q, index)

: process_id =

'process--'

+str

(index)

while

not q.empty():

url = q.get(timeout=2)

try:

r = requests.get(url, timeout=20)

print

(process_id, q.qsize(

), r.status_code, url)

except exception as e:

print

(process_id, q.qsize(

), url,

'error:'

, e)

if __name__ ==

'__main__'

: manager = manager(

) workqueue = manager.queue(

1010

) start = time.time(

)# 填充佇列

for url in link_list:

workqueue.put(url)

pool = pool(processes=3)

for i in

range(4

):(workqueue, i)

)print

("started processes"

) pool.close(

) pool.join(

) end = time.time(

)print

('pool+ queue多程序爬蟲的總時間為:'

, end - start)

print

('main process ended!'

)

如果要將執行緒池pool和 queue結合,queue的使用方式就需要改變,這裡用到multiprocessingmanger中的,使用 manager=manager(和 workqueue=manager. queue(1000)來建立佇列。這個佇列物件可以在父程序與子程序間通訊。

multiprocessing共享記憶體

這裡我們實際上只有主程序和process物件代表的程序。我們在主程序的記憶體空間中建立共享的記憶體,也就是value和array兩個物件。物件value被設定成為雙精度數 d 並初始化為1.0。而array則類似於c中的陣列,有固定的型別 i,也就是整數 在process程序中,我們修改了value...

程序 multiprocessing詳解

一 核心 就是像執行緒一樣管理程序 類似於threading cup利用率較好,該模組用來跨平台的多程序模組,含有乙個process 類代表程序物件,start 啟動程序 process語法結構如下 process group target name args kwargs target 表示這個程...

正確使用 Multiprocessing 的姿勢

import multiprocessing as mp 要執行的任務函式 def task pid,name print pid pid,name name return str pid name def main pool mp.pool cpus mp.cpu count res list l...