Python多线程中全局变量引发的文件名覆盖问题及解决方案
本文分析Python多线程爬虫中因多个线程同时读写全局变量导致的文件名覆盖问题。通过引入锁机制保护全局变量操作,确保每个线程获取唯一的文件编号,从而解决文件被重复覆盖的bug,保障多线程环境下的数据完整性。
今早开始编写爬虫程序,基础框架搭建完毕后,在集成多线程抓取功能时遇到了错误。
例如,在包含200个下载链接的URL列表中启动50个线程。然而,我的爬虫程序竟然将这50个链接下载的文件全部命名为0.html。最终结果显示,存在一个被后续下载覆盖的0.html,以及从1到150的文件。以下是导致该问题的原始代码:
x = str(theguardian_globle.g) #x为给下载的文件命的名 filePath = "E://wgetWeiBao//"+x+".html" try: wget.download(url,filePath) theguardian_globle.g+=1 print x+" is downloading..." except: print "error!"
#这个是全局变量g的定义 global g g = 0
随后定位到问题根源:多线程与全局变量结合使用存在风险。由于程序中存在多个同时执行的线程,它们对全局变量进行并发操作会导致状态混乱。在多线程环境中操作全局变量时,必须对该操作加锁以确保原子性。
以下是修正后的代码实现:
函数: def downLoad(url,num): x = str(num) filePath = "E://wgetWeiBao//"+x+".html" try: wget.download(url,filePath) print x+" is downloading..." except: print "error!"
多线程消费者_给操作全局变量的语句加锁
class Cosumer(threading.Thread):
def run(self):
print('%s:started' % threading.current_thread())
while True:
global gCondition
gCondition.acquire()
while q.empty()==True:
gCondition.wait()
url = q.get()
num = theguardian_globle.g
theguardian_globle.g+=1
gCondition.release()
downLoad(url,num)
问题已解决!
以上就是本文关于Python多线程与全局变量问题的详细解析,希望对各位有所帮助。也欢迎大家继续支持本站获取更多技术分享。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













