刚开始研究多线程,看了很多视频跟文章,但还是概念混淆,所以过来论坛求助。
1、
对于爬虫而言,for 循环多线程抓取 N 个页面,然后获取内容到 MongoDB 数据库,错误链接写入 error.txt,是线程安全的吗?如果不安全,我通过在类里面的采集入库跟写入文件加锁,是不是可以解决?我之前没加锁,抓了 36W 条数据,感觉没发现有什么问题。
入库部分如下:
# 启动抓取函数
def run(self):
try:
rst_json = self.claw_detail()
if rst_json != None:
gLock.acquire()
result = table_lines.insert_one(rst_json)
gLock.release()
else:
result = 'null'
except:
with open(file_path + "/error.txt", 'a+') as f1:
f1.write(self.hotelid)
f1.write('\n')
f1.flush()
result = 'error'
time.sleep(5)
finally:
time.sleep(1)
return result
2、
多层 for 循环嵌套的时候,这么用多线程可以吗? t.join()这么用没有问题吧? t.setDaemon(True)需要设置吗?
def main(): for dateTuple in dateList:
threads = []
for i in id_lines.find():
hotelId = i.get('hotelId')
threads.append(hotelId)
for hotelid in threads:
t = ClawData(hotelid,headersCookie)
#t.setDaemon(True)
t.start()
for hotelid in threads:
t.join()
time.sleep(3)
非常感谢!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.