使用Python多线程犯的错误总结

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

第一个错误:

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

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

代码如下:

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

#! /usr/bin/env python
#
coding=utf-8

from ftplib import FTP
from datetime import datetime
import sys
import os
import threading

FTP_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').write
        ftp.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 e

           
try:
                self.ftp_download(each_file)
           
except Exception ,e:
               
print each_file ,' FTP download fail'
                print e

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

定位过程:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6ab2b589eb4caca41ef4cca03743e295.html