Python多线程中全局变量引发的文件名覆盖问题及解决方案

青禾
青禾
发布时间:2026-10-13 | 5人浏览过
原创

本文分析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多线程与全局变量问题的详细解析,希望对各位有所帮助。也欢迎大家继续支持本站获取更多技术分享。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表