python queue 多生產者,多消費者

2021-09-28 17:51:55 字數 3831 閱讀 1458

專案需求是從快**爬取ip,運用到專案中,設定佇列的大小,當有ip被消耗時,就新增新的ip到佇列中,獲取ip的頁面是不斷重新整理的。

總的來說,就是一方不斷把爬取ip存到佇列中,一方不斷從佇列中取ip,消耗ip,此處爬取的是快**

首先建立乙個佇列

from queue import queue

q =  queue.queue() # 括號裡可填佇列大小,maxsize=50

其次,建立乙個獲取ip通知鎖

import threading

proxylock = threading.condition()

然後編寫爬取ip**,把它逐個加到佇列中

queue.empty(), 非阻塞時,隊列為空,取資料,報異常

queue._put(), 新增元素到佇列中

# coding:utf-8

import requests, traceback

import threading, time, re

try:

from queue import queue, empty

except:

from queue import queue, empty

# 設定全域性變數

proxyqueue = queue() # 儲存**列表

proxylock = threading.condition() # **獲取通知鎖

'''後台執行緒函式,等待通知,自動獲取填充**ip'''

global proxylock, proxyqueue

print("autogetproxy ready:", proxylock.acquire()) # 先鎖起來,然後等待解鎖

try:

while proxyswitch: # 等待獲取通知

proxylock.wait()

print(u"開始填充**ip,當前數量:%d" % proxyqueue.qsize())

while true: # 獲取**ip,直到獲取成功

try:

res = requests.get(proxyurl, timeout=15)

if res.status_code == 200:

need_add_white = re.search(u'請將(.*?)設定為', res.text)

if need_add_white:

need_add_white = need_add_white.group(1)

requests.get(

m = re.findall(r"data-title=\"ip\">(.*?)<", res.text)

if m:

proxyqueue.not_full.acquire()

# 批量寫入到列隊裡面

try:

for i in m:

proxyqueue._put(i)

proxyqueue.unfinished_tasks += 1

finally:

proxyqueue.not_empty.notify()

proxyqueue.not_full.release()

# time.sleep(5) 測試用

proxylock.notify()

print(u"填充**ip列表成功,當前數量:%d" % proxyqueue.qsize())

else:

# print res.text

proxylock.notify()

proxylock.wait()

time.sleep(3)

continue

break

except:

print (traceback.print_exc())

proxylock.notify()

proxylock.wait()

# time.sleep(5) # 如果發生異常,則延遲後 繼續

finally:

proxylock.release()

def getproxy(

ms=10, # 設定等待時間,預設無限等待

getstop=5 # 嘗試獲取次數,超過次數則放棄獲取

): '''獲取**ip'''

global proxylock, proxyqueue, proxytype

proxylock.acquire()

try:

for i in range(getstop):

try:

proxy_ip = proxyqueue.get_nowait()

# 如果當前可用ip數低於min,則通知獲取

if proxyqueue.qsize() <= proxyminip:

proxylock.notify()

print(u"獲取**ip成功,當前數量:%d" % proxyqueue.qsize())

'''啟動後台執行緒,自動填充**ip池 '''

global proxytype, proxyurl, proxyswitch

proxytype = proxy_type

proxyurl = url

print ("startautogetproxy", proxyswitch)

if not proxyswitch:

proxyswitch = true

threading.thread(target=autogetproxy).start()

def getproxytype():

global proxytype, proxyurl

return proxytype

def setproxytype(proxy_type):

global proxytype

proxytype = proxy_type

class proxypool():

def __init__(self

, waittime=10 # 設定等待時間,預設無限等待

, gettry=5 # 嘗試獲取次數,超過次數則放棄獲取

多生產者 多做「生產者」,少做「消費者」

生產者 vs 消費者 哪個更好?消費者 定義非常廣泛,購買一件物品 進行一次消費的人都是消費者 更深一層的含義就是 消費 了你的金錢 時間 精力,比如刷抖音,花費了你的時間和精力,單方面地接受資訊 向內汲取 向外消耗時間或金錢,那你就是 消費者 生產者 生產 製造 創作了某個物品 作品,別人消費你的...

生產消費模型 多生產者vs多消費者

使用場景 遊戲中多個玩家生產任務,伺服器多執行緒處理任務,netty工作執行緒收到客戶端傳來資料,生成任務後,加入到任務佇列中 public abstract class basetask 任務管理器 public class mutitaskmanager private final static...

單生產者 多消費者模型

問題出處 生產者消費者問題 有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,所有生產者和消費者都是非同步方式執行的,但它們必須保持同步,即不...