【发布时间】:2018-08-23 02:33:19
【问题描述】:
背景:
我想监控 100 个 URL(拍摄快照,如果内容与以前不同,则将其存储),我的计划是使用 urllib.request 每 x 分钟扫描一次,比如 x=5,不间断。
所以我不能使用单个 for 循环和睡眠,因为我想启动对 ULR1 的检测,然后几乎同时启动 URL2。
while TRUE:
for url in urlList:
do_detection()
time.sleep(sleepLength)
因此我应该使用池?但我应该将线程限制在我的 CPU 可以处理的少量(如果我有 100 个 ULR,则不能设置为 100 个线程)
我的问题:
即使我可以将列表中的 100 个 URL 发送到具有四个线程的 ThreadPool(4),我应该如何设计来控制每个线程来处理 100/4=25 个 URL,因此线程会探测 URL1,sleep(300)在下一次探测到 URL1 之前,然后执行 URL2.... ULR25 并返回到 URL1...?我不想等待 5 分钟 * 25 个完整的周期。
伪代码或示例将有很大帮助!我找不到或想办法让 looper() 和detector() 按需要运行?
(我认为How to scrap multiple html page in parallel with beautifulsoup in python? 这是接近但不准确的答案)
也许每个线程都这样?我现在将尝试解决如何将 100 个项目拆分到每个线程。使用 pool.map(func, iterable[, chunksize]) 需要一个列表,我可以将 chunksize 设置为 25。
def one_thread(Url):
For url in Url[0:24]:
CurrentDetect(url)
if 300-timelapsed>0:
remain_sleeping=300-timtlapsed
else:
remain_sleeping=0
sleep (remain_sleeping)
For url in Url[0:24]:
NextDetect()
我正在尝试编写的非工作代码:
import urllib.request as req
import time
def url_reader(url = "http://stackoverflow.com"):
try
f = req.urlopen(url)
print (f.read())
except Exception as err
print (err)
def save_state():
pass
return []
def looper (sleepLength=720,urlList):
for url in urlList: #initial save
Latest_saved.append(save_state(url_reader(url))) # return a list
while TRUE:
pool = ThreadPool(4)
results = pool.map(urllib2.urlopen, urls)
time.sleep(sleepLength) # how to parallel this? if we have 100 urls, then takes 100*20 min to loop?
detector(urlList) #? use last saved status returned to compare?
def detector (urlList):
for url in urlList:
contentFirst=url_reader(url)
contentNext=url_reader(url)
if contentFirst!=contentNext:
save_state(contentFirst)
save_state(contentNext)
【问题讨论】:
-
有建议用scrapy,内置线程分配?
-
你用Python官方例子搞定了吗? :)
标签: python multithreading