專案需求是從快**爬取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...
單生產者 多消費者模型
問題出處 生產者消費者問題 有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,所有生產者和消費者都是非同步方式執行的,但它們必須保持同步,即不...