Python爬蟲 程序和執行緒1

2022-08-10 18:00:18 字數 3544 閱讀 2991

1、使用multiprocessing 模組建立多程序

process

process類描述乙個程序物件,建立process例項只需要傳入乙個函式和函式的引數即可。

使用 process() 方法建立程序

使用 start() 方法啟動程序

使用 join() 方法實現程序同步

乙個例子:

# coding=utf8

import os

from multiprocessing import process

def run_proc(name):

print 'child process %s (%s) running...' %(name, os.getpid())

if __name__ == '__main__':

print 'parent process is %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 'main process end'

pool

pool類描述乙個程序池物件,可以提供指定數量的程序共使用者呼叫,預設大小是cpu的核數。

乙個例子:

# coding=utf8

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)

for i in range(5):

print 'waiting for all subprocesses done...'

p.close() # 呼叫join()之前先必須呼叫close(),呼叫close()之後就不會繼續新增新的process了

p.join()

print 'all subprocesses done.'

2、程序間通訊

queue

queue類用來在多個程序間實現通訊

put方法:插入資料到佇列中

get方法:從佇列中讀取並刪除乙個元素

乙個例子:

# coding=utf8

'''從父程序建立三個子程序,兩個程序往queue中寫資料,乙個從queue中讀資料

'''from multiprocessing import process, queue

import os, time, random

from test.test_threading_local import target

# 寫程序

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

print 'get %s from queue' % url

if __name__ == '__main__':

q = queue()

writer1 = process(target=proc_write, args=(q, ['url_1','url_2','url_3']))

writer2 = process(target=proc_write, args=(q, ['url_4','url_5','url_6']))

reader = process(target=proc_read, args=(q,))

# 啟動寫程序

writer1.start()

writer2.start()

# 啟動讀程序

reader.start()

# 等待寫程序結束

writer1.join()

writer2.join()

# 強制結束讀程序

reader.terminate()

pipe

pipe類用來在兩個程序之間通訊,類似於乙個管道,pipe方法返回(conn1,conn2)代表管道兩端,引數duplex為true是全雙工模式。

乙個例子:

# coding=utf8

from multiprocessing import pipe, process

import random, time, os

from test.test_threading_local import target

'''建立兩個程序,乙個通過pipe傳送資料,乙個通過pipe接收資料

'''def proc_send(pipe, urls):

for url in urls:

print 'process (%s) send: %s' % (os.getpid(), url)

pipe.send(url)

time.sleep(random.random())

def proc_recv(pipe):

while true:

print 'process (%s) recv: %s' % (os.getpid(), pipe.recv())

time.sleep(random.random())

if __name__ == '__main__':

pipe = pipe()

p1 = process(target=proc_send, args=(pipe[0], ['url_'+str(i) for i in range(10)]))

p2 = process(target=proc_recv, args=(pipe[1],))

p1.start()

p2.start()

p1.join()

p2.terminate()

Python爬蟲 程序和執行緒2

1 使用threading模組建立執行緒 方式一 把函式傳入並建立thread例項,然後呼叫start方法開始執行 coding utf8 建立多執行緒的方式一 把函式傳入並建立thread例項,然後呼叫start方法開始執行 import random,time import threading ...

Python爬蟲 非同步爬蟲(多程序和多執行緒)

非同步爬蟲 在爬蟲中使用非同步實現高效能的資料爬取操作 執行緒是程式執行的最小單位,乙個程序可以有多個執行緒。非同步爬蟲的方式 多程序,多執行緒 不建議 好處 可以為相關阻塞的操作單獨開啟程序或者執行緒,阻塞操作就可以非同步執行 繼續執行阻塞的操作之後的 弊端 無法無限制地開啟多程序或者多執行緒 程...

python 爬蟲 多執行緒 多程序

乙個程式至少有乙個程序,乙個程序至少有乙個執行緒.資源 程序擁有獨立資源,執行緒依賴於程序,沒有獨立資源,所有該程序的執行緒共享所在程序的所有資源。劃分尺度 執行緒的劃分尺度小於程序 資源比程序少 使得多執行緒程式併發性更高。執行緒 執行緒的執行開銷小,但不利於資源的管理和儲存。程序 多個程序之間相...