使用Python多线程犯的错误总结
在使用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多线程犯的错误总结相关推荐
- python 多线程读写文件错误_python多线程老是报错。大神帮忙看看哈?
以下是代码:importthreadingimporttimeproducts=[]condition=threading.Condition()classConsumer(threading.Thr ...
- python 教材为什么喜欢用spam举例_斯坦福大学教授列举出的python入门最容易犯的错误,你中招了吗?...
Python 以其简单易懂的语法格式与其它语言形成鲜明对比,初学者遇到最多的问题就是不按照 Python 的规则来写,即便是有编程经验的程序员,也容易按照固有的思维和语法格式来写 Python 代码, ...
- 十个Python初学者常犯的错误
下面10个Python初学者常犯的错误,并不是真正的代码错误,代码照样可以运行,但是不够Pythonic,因为Python有自己的语言哲学,在代码的处理上有传统语言无法比拟的简洁性和便捷性. 1. ...
- python多线程读取文件的问题_Python多线程同步---文件读写控制方法
1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env python #coding=utf-8 import os def ReadTimes(): res ...
- python 多线程和协程结合_一文讲透 “进程、线程、协程”
本文从操作系统原理出发结合代码实践讲解了以下内容: 什么是进程,线程和协程? 它们之间的关系是什么? 为什么说Python中的多线程是伪多线程? 不同的应用场景该如何选择技术方案? ... 什么是进程 ...
- 人生苦短之Python多线程
#encoding=utf-8 import threading import time''' python多线程并不是真正意义上的多线程,通常我们所说的多线程是多个线程同时执行某功能,而在pytho ...
- python 多进程_说说Python多线程与多进程的区别?
公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...
- python多线程爬虫实例-Python实现多线程爬虫
编辑推荐: 本文主要介绍对Python多线程爬虫实战的整体的思路,希望对大家有帮助. 本文来知乎,由火龙果软件Alice编辑,推荐. 最近在写爬虫程序爬取亚马逊上的评论信息,因此也自学了很多爬虫相关的 ...
- python多线程与GIL
目录 1.GIL 1.1 为什么要有GIL 1.2 GIL的运作方式 1.3 GIL带来的问题 2.多线线程 2.1 线程的调度和启动 3.线程构造与使用 3.1调用Thread类构造器创建线程 3. ...
最新文章
- docker 可视化管理工具 rancher 简介
- 字符串类String
- Memcached的使用
- 听一听蚂蚁金服机器学习算法中台周俊谈共享智能技术实践:如何降低数据共享的难度?
- oracle數據庫any,Oracle权限集合全集
- 将EntityManager.refresh添加到所有Spring数据存储库
- C语言项目:图形马赛克处理技术
- simplified build configuration
- 老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数 2...
- php创建一个类,JavaScript_创建一个类Person的简单实例,创建一个类Person,包含以下属 - phpStudy...
- SpringBoot中是如何创建WebServer的?
- api64 gta5缺少steam_GTA5无法启动此程序,因为计算机中丢失steam_api64.dll 游戏打不来 现实这个,win7 64位....
- x轴z轴代表的方向图片_x轴y轴z轴代表的方向_x轴y轴z轴代表的方向图
- java 调用阿里云中通快递查询示例
- PCIE DWC - 3 - PCI-PM Software Compatible Mechanisms
- 软件测试选哪个技术方向分支_硬件测试转软件测试,应该选哪个方向
- 光滑性准则(Smoothness Rule) 递推方程(Recursive Equation)
- 10000小时=1万小时
- FreeRTOS 简介
- SpringBoot集成支付平台