在使用Python多线程的时候,在使用多线程编程的时候,由于对于变量作用域和多线程不是很熟悉,导致在使用多线程的时候,犯了低级的错误。

第一个错误:

在多线程中使用全局变量,导致多个线程修改全局变量。执行信息错乱,开始是几个个进程,后面就变成一个了。后来经过重新学习多线程,才把原来的错误修改过来。

脚本功能,多线程向设备上传和下载文件,测试ftp功能和性能。错误原因是把ftp变量设置为了全局变量,导致出现怪异的现象,开始有几个线程在跑,然后几个进程退出,最后变为一个,还出现了ftp密码错误的提示。当时调试了好久,后来使用pycharm工具,观察到了问题的原因。

代码如下:

红色的代码为错误的版本,最初的时候,ftp变量在外面,作为全局变量使用。绿色的代码为修改正确的版本。

#! /usr/bin/env python
#coding=utf-8from ftplib import FTP
from datetime import datetime
import sys
import os
import threadingFTP_Port='21'
Telnet_Port='23'
buffsize=1024
#ftp=FTP()
class ftp_test(threading.Thread):upload_dir="../upload/"download_dir="../download"IP =''Username=''Password=''def __init__(self,env_para):threading.Thread.__init__(self)self.IP=env_para['IP_Addr']self.Password= env_para['Password']self.Username= env_para['admin']self.upload_dir= env_para['upload_dir']self.download_dir= env_para['download_dir']def ftp_upload(self,tfile):ftp=FTP()ftp.connect(self.IP, FTP_Port,timeout=10)ftp.login(self.Username,self.Password)#print ftp.getwelcome()
        ftp.cwd(ramdisk)#print ftp.dir()
file_handler=open(self.upload_dir + tfile,'rb')ftp.storbinary('STOR '+ tfile ,file_handler,buffsize)#ftp.dir()
file_handler.close()ftp.quit()print tfile,' Upload OK'def ftp_download(self,t_file):ftp=FTP()ftp.connect(self.IP, FTP_Port,timeout=10)#ftp.set_debuglevel(2)
        ftp.login(self.Username,self.Password)filename = t_file +'_download'file_write=open( self.download_dir + filename,'wb').writeftp.retrbinary('RETR '+ filename, file_write, buffsize)ftp.delete(filename)ftp.quit()print t_file,' FTP download OK'def run(self):file_list=os.listdir(self.upload_dir)for each_file in file_list:try:self.ftp_upload(each_file)except Exception ,e:print each_file ,' FTP Upload fail'print etry:self.ftp_download(each_file)except Exception ,e:print each_file ,' FTP download fail'print e

这样在函数中定义,缩小了ftp变量的作用域,终于完成了ftp并行的上传和下载。

定位过程:

在使用pycharm调试时,观察ftp变量的变化,发现只有一个ftp变量,所有的进程都使用的是这一个变量,ftp变量记录的ftp状态不断在变化,出现了各种奇怪的现象。

在缩小了ftp变量的作用域后,重新调试,观察到ftp变量在每个进行中的地址都不一样,每个ftp的变化不受其他进程影响。

第二个错误:

因为在网络上学习分享的多线程文章,受 http://www.cnblogs.com/fnng/p/3670789.html 这个分享的影响,在线程启动后,直接写了t.join(),不是把所有的进程都加了join。

导致执行慢的进程被主线程直接终止,出现了多次ftp没有执行完成,线程就退出。

正确的写法是:

for t in threads:

  t.join()

这个分析当时把我害苦了,调试了老半天才发现这个错误。

总结心得:

对于学习还是要看书籍系统的学习。

另外,学会使用工具调试,观察变量的变化,深入理解程序运行,方便定位问题。

转载于:https://www.cnblogs.com/StitchSun/p/4256525.html

使用Python多线程犯的错误总结相关推荐

  1. python 多线程读写文件错误_python多线程老是报错。大神帮忙看看哈?

    以下是代码:importthreadingimporttimeproducts=[]condition=threading.Condition()classConsumer(threading.Thr ...

  2. python 教材为什么喜欢用spam举例_斯坦福大学教授列举出的python入门最容易犯的错误,你中招了吗?...

    Python 以其简单易懂的语法格式与其它语言形成鲜明对比,初学者遇到最多的问题就是不按照 Python 的规则来写,即便是有编程经验的程序员,也容易按照固有的思维和语法格式来写 Python 代码, ...

  3. 十个Python初学者常犯的错误

    下面10个Python初学者常犯的错误,并不是真正的代码错误,代码照样可以运行,但是不够Pythonic,因为Python有自己的语言哲学,在代码的处理上有传统语言无法比拟的简洁性和便捷性. 1.   ...

  4. python多线程读取文件的问题_Python多线程同步---文件读写控制方法

    1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env python #coding=utf-8 import os def ReadTimes(): res ...

  5. python 多线程和协程结合_一文讲透 “进程、线程、协程”

    本文从操作系统原理出发结合代码实践讲解了以下内容: 什么是进程,线程和协程? 它们之间的关系是什么? 为什么说Python中的多线程是伪多线程? 不同的应用场景该如何选择技术方案? ... 什么是进程 ...

  6. 人生苦短之Python多线程

    #encoding=utf-8 import threading import time''' python多线程并不是真正意义上的多线程,通常我们所说的多线程是多个线程同时执行某功能,而在pytho ...

  7. python 多进程_说说Python多线程与多进程的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  8. python多线程爬虫实例-Python实现多线程爬虫

    编辑推荐: 本文主要介绍对Python多线程爬虫实战的整体的思路,希望对大家有帮助. 本文来知乎,由火龙果软件Alice编辑,推荐. 最近在写爬虫程序爬取亚马逊上的评论信息,因此也自学了很多爬虫相关的 ...

  9. python多线程与GIL

    目录 1.GIL 1.1 为什么要有GIL 1.2 GIL的运作方式 1.3 GIL带来的问题 2.多线线程 2.1 线程的调度和启动 3.线程构造与使用 3.1调用Thread类构造器创建线程 3. ...

最新文章

  1. docker 可视化管理工具 rancher 简介
  2. 字符串类String
  3. Memcached的使用
  4. 听一听蚂蚁金服机器学习算法中台周俊谈共享智能技术实践:如何降低数据共享的难度?
  5. oracle數據庫any,Oracle权限集合全集
  6. 将EntityManager.refresh添加到所有Spring数据存储库
  7. C语言项目:图形马赛克处理技术
  8. simplified build configuration
  9. 老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数 2...
  10. php创建一个类,JavaScript_创建一个类Person的简单实例,创建一个类Person,包含以下属 - phpStudy...
  11. SpringBoot中是如何创建WebServer的?
  12. api64 gta5缺少steam_GTA5无法启动此程序,因为计算机中丢失steam_api64.dll 游戏打不来 现实这个,win7 64位....
  13. x轴z轴代表的方向图片_x轴y轴z轴代表的方向_x轴y轴z轴代表的方向图
  14. java 调用阿里云中通快递查询示例
  15. PCIE DWC - 3 - PCI-PM Software Compatible Mechanisms
  16. 软件测试选哪个技术方向分支_硬件测试转软件测试,应该选哪个方向
  17. 光滑性准则(Smoothness Rule) 递推方程(Recursive Equation)
  18. 10000小时=1万小时
  19. FreeRTOS 简介
  20. SpringBoot集成支付平台

热门文章

  1. 如何将1寸证件照片改为两寸,如何调整证件照片背景?
  2. 信息系统项目管理师必背核心考点(五十七)知识管理工具
  3. 设计模式之15 - 解释器模式Interpreter
  4. 微信小程序开发者工具初体验及实现技术初探
  5. 东南大学2014计算机考研真题,2014年东南大学计算机专业考研真题
  6. 【项目精选】智慧物业管理系统
  7. 【转载】利用ArcGIS Engine 二次开发的使用和总结
  8. 绿色版eclipse
  9. Unity3d动画脚本 Animation Scripting
  10. 2023华为od机试真题B卷【跳房子2】Java 实现