zoukankan      html  css  js  c++  java
  • python3_ftp多线程上传图片

    项目中研发人员自己写了ftp服务,没有标准ftp中的列表,准备用jmeter对ftp压力测试时发现jmeter要验证列表(如果有同学用jmeter测试过类似的分享一下方法谢谢了),没办法只能用python编写一个多线程的脚本对ftp进行简单的压力测试,项目也只需要一个粗略的结果

      1 #!/usr/bin/python3
      2 from ftplib import FTP
      3 import time
      4 import threading
      5 import random
      6 import sys
      7 
      8 
      9 threadLock = threading.Lock()
     10 g_count = 0
     11 
     12 
     13 def ftpconnect(host, username, password):
     14     ftp = FTP()
     15     ftp.set_debuglevel(2)
     16     ftp.connect(host, 2008)
     17     ftp.login(username, password)
     18     return ftp
     19 
     20 
     21 def downloadfile(ftp, remotepath, localpath):
     22     bufsize = 1024
     23     fp = open(localpath, 'wb')
     24     ftp.retrbinary('RETR ' + remotepath, fp.write, bufsize)
     25     ftp.set_debuglevel(0)
     26     fp.close()
     27 
     28 
     29 def uploadfile(ftp, localpath, remotepath):
     30     bufsize = 1024
     31     fp = open(localpath, 'rb')
     32     ftp.storbinary('STOR ' + remotepath, fp, bufsize)
     33     ftp.set_debuglevel(0)
     34     fp.close()
     35 
     36 
     37 # def print_time(threadName, delay, counter):
     38 #     while counter:
     39 #         time.sleep(delay)
     40 #         print("%s: %s" % (threadName, time.ctime(time.time())))
     41 #         counter -= 1
     42 
     43 def testuploadfile(threadName):
     44     global threadLock
     45     global g_count
     46     ftp = ftpconnect("10.1.1.61", "admin", "admin")
     47     start_tick = time.time()
     48     count = 0
     49     while True:
     50         pic_name = '51010000491320000001/' + threadName + '_' + str(count) + '.jpg'
     51         uploadfile(ftp, "/home/xzrs/ftp/face1.jpg", pic_name)
     52         end_tick = time.time()
     53         count = count + 1
     54         if (end_tick - start_tick) > 1.0:
     55             break
     56     ftp.quit()
     57     print(threadName+': count='+str(count))
     58     threadLock.acquire()
     59     g_count = g_count + count
     60     threadLock.release()
     61 
     62 def virtualUploadFile():
     63     global threadLock
     64     global g_count
     65     start_tick = time.time()
     66     count = 0
     67     while True:
     68         num = random.random()
     69         time.sleep(num)
     70         end_tick = time.time()
     71         count = count + 1
     72         if (end_tick - start_tick) > 1.0:
     73             break
     74     threadLock.acquire()
     75     g_count = g_count + count
     76     threadLock.release()
     77 
     78 
     79 class MyThread(threading.Thread):
     80     def __init__(self, threadID, name):
     81         threading.Thread.__init__(self)
     82         self.threadID = threadID
     83         self.name = name
     84 
     85     def run(self):
     86         print("start:"+self.name)
     87         testuploadfile(self.name)
     88         # virtualUploadFile()
     89         print("end:"+self.name)
     90 
     91 if __name__ == "__main__":
     92     threadList = []
     93     #for i in range(0,int(sys.argv[1])):
     94     for i in range(0,10):    
     95         thread = MyThread(i, "Thread_" + str(i))
     96         thread.start()
     97         threadList.append(thread)
     98     for t in threadList:
     99         t.join()
    100     print(sys.argv)
    101     print("main exit...")
    102     print('g_count='+str(g_count))

    在服务器终端运行结果:

    python3 ftp_threading.py |tee  log.log

      1 start:Thread_0
      2 start:Thread_1
      3 start:Thread_2
      4 start:Thread_3
      5 start:Thread_4
      6 start:Thread_5
      7 start:Thread_6
      8 start:Thread_7
      9 *get* '220 welcome
    '
     10 *resp* '220 welcome'
     11 *cmd* 'USER admin'
     12 *put* 'USER admin
    '
     13 start:Thread_8
     14 *get* '220 welcome
    '
     15 *resp* '220 welcome'
     16 *cmd* 'USER admin'
     17 *put* 'USER admin
    '
     18 *get* '331 need password
    '
     19 *resp* '331 need password'
     20 *cmd* 'PASS *****'
     21 *put* 'PASS *****
    '
     22 *get* '220 welcome
    '
     23 *resp* '220 welcome'
     24 *cmd* 'USER admin'
     25 *put* 'USER admin
    '
     26 *get* '230 welcome to my ftp!
    '
     27 *resp* '230 welcome to my ftp!'
     28 start:Thread_9
     29 *get* '220 welcome
    '
     30 *resp* '220 welcome'
     31 *cmd* 'USER admin'
     32 *put* 'USER admin
    '
     33 *get* '331 need password
    '
     34 *resp* '331 need password'
     35 *cmd* 'PASS *****'
     36 *put* 'PASS *****
    '
     37 *get* '220 welcome
    '
     38 *resp* '220 welcome'
     39 *cmd* 'USER admin'
     40 *put* 'USER admin
    '
     41 *cmd* 'TYPE I'
     42 *put* 'TYPE I
    '
     43 *get* '331 need password
    '
     44 *resp* '331 need password'
     45 *cmd* 'PASS *****'
     46 *put* 'PASS *****
    '
     47 *get* '220 welcome
    '
     48 *resp* '220 welcome'
     49 *cmd* 'USER admin'
     50 *put* 'USER admin
    '
     51 *get* '230 welcome to my ftp!
    '
     52 *resp* '230 welcome to my ftp!'
     53 *get* '220 welcome
    '
     54 *resp* '220 welcome'
     55 *cmd* 'USER admin'
     56 *put* 'USER admin
    '
     57 *get* '200 TYPE set to I.
    '
     58 *resp* '200 TYPE set to I.'
     59 *cmd* 'PASV'
     60 *put* 'PASV
    '
     61 *get* '220 welcome
    '
     62 *resp* '220 welcome'
     63 *cmd* 'USER admin'
     64 *put* 'USER admin
    '
     65 *get* '331 need password
    '
     66 *resp* '331 need password'
     67 *cmd* 'PASS *****'
     68 *put* 'PASS *****
    '
     69 *get* '230 welcome to my ftp!
    '
     70 *resp* '230 welcome to my ftp!'
     71 *get* '331 need password
    '
     72 *resp* '331 need password'
     73 *cmd* 'PASS *****'
     74 *put* 'PASS *****
    '
     75 *get* '331 need password
    '
     76 *resp* '331 need password'
     77 *cmd* 'PASS *****'
     78 *put* 'PASS *****
    '
     79 *get* '331 need password
    '
     80 *resp* '331 need password'
     81 *cmd* 'PASS *****'
     82 *put* 'PASS *****
    '
     83 *get* '331 need password
    '
     84 *resp* '331 need password'
     85 *cmd* 'PASS *****'
     86 *put* 'PASS *****
    '
     87 *cmd* 'TYPE I'
     88 *put* 'TYPE I
    '
     89 *get* '230 welcome to my ftp!
    '
     90 *resp* '230 welcome to my ftp!'
     91 *get* '230 welcome to my ftp!
    '
     92 *resp* '230 welcome to my ftp!'
     93 *cmd* 'TYPE I'
     94 *put* 'TYPE I
    '
     95 *get* '230 welcome to my ftp!
    '
     96 *resp* '230 welcome to my ftp!'
     97 *get* '220 welcome
    '
     98 *resp* '220 welcome'
     99 *cmd* 'USER admin'
    100 *put* 'USER admin
    '
    101 *get* '230 welcome to my ftp!
    '
    102 *resp* '230 welcome to my ftp!'
    103 *get* '230 welcome to my ftp!
    '
    104 *resp* '230 welcome to my ftp!'
    105 *get* '200 TYPE set to I.
    '
    106 *resp* '200 TYPE set to I.'
    107 *cmd* 'PASV'
    108 *put* 'PASV
    '
    109 *cmd* 'TYPE I'
    110 *put* 'TYPE I
    '
    111 *get* '227 Entering Passive Mode(10,1,1,61,173,162)
    '
    112 *resp* '227 Entering Passive Mode(10,1,1,61,173,162)'
    113 *cmd* 'TYPE I'
    114 *put* 'TYPE I
    '
    115 *get* '200 TYPE set to I.
    '
    116 *resp* '200 TYPE set to I.'
    117 *cmd* 'PASV'
    118 *put* 'PASV
    '
    119 *cmd* 'TYPE I'
    120 *put* 'TYPE I
    '
    121 *cmd* 'TYPE I'
    122 *put* 'TYPE I
    '
    123 *cmd* 'TYPE I'
    124 *put* 'TYPE I
    '
    125 *get* '200 TYPE set to I.
    '
    126 *resp* '200 TYPE set to I.'
    127 *cmd* 'PASV'
    128 *put* 'PASV
    '
    129 *get* '331 need password
    '
    130 *resp* '331 need password'
    131 *cmd* 'PASS *****'
    132 *put* 'PASS *****
    '
    133 *get* '200 TYPE set to I.
    '
    134 *resp* '200 TYPE set to I.'
    135 *cmd* 'PASV'
    136 *put* 'PASV
    '
    137 *get* '200 TYPE set to I.
    '
    138 *resp* '200 TYPE set to I.'
    139 *cmd* 'PASV'
    140 *put* 'PASV
    '
    141 *get* '200 TYPE set to I.
    '
    142 *resp* '200 TYPE set to I.'
    143 *cmd* 'PASV'
    144 *put* 'PASV
    '
    145 *get* '200 TYPE set to I.
    '
    146 *resp* '200 TYPE set to I.'
    147 *cmd* 'PASV'
    148 *put* 'PASV
    '
    149 *get* '230 welcome to my ftp!
    '
    150 *resp* '230 welcome to my ftp!'
    151 *get* '227 Entering Passive Mode(10,1,1,61,181,118)
    '
    152 *resp* '227 Entering Passive Mode(10,1,1,61,181,118)'
    153 *get* '227 Entering Passive Mode(10,1,1,61,132,196)
    '
    154 *resp* '227 Entering Passive Mode(10,1,1,61,132,196)'
    155 *cmd* 'TYPE I'
    156 *put* 'TYPE I
    '
    157 *get* '227 Entering Passive Mode(10,1,1,61,165,174)
    '
    158 *resp* '227 Entering Passive Mode(10,1,1,61,165,174)'
    159 *cmd* 'STOR 51010000491320000001/Thread_8_0.jpg'
    160 *put* 'STOR 51010000491320000001/Thread_8_0.jpg
    '
    161 *get* '227 Entering Passive Mode(10,1,1,61,156,145)
    '
    162 *resp* '227 Entering Passive Mode(10,1,1,61,156,145)'
    163 *cmd* 'STOR 51010000491320000001/Thread_0_0.jpg'
    164 *put* 'STOR 51010000491320000001/Thread_0_0.jpg
    '
    165 *get* '220 welcome
    '
    166 *resp* '220 welcome'
    167 *cmd* 'USER admin'
    168 *put* 'USER admin
    '
    169 *cmd* 'STOR 51010000491320000001/Thread_7_0.jpg'
    170 *put* 'STOR 51010000491320000001/Thread_7_0.jpg
    '
    171 *get* '200 TYPE set to I.
    '
    172 *resp* '200 TYPE set to I.'
    173 *cmd* 'PASV'
    174 *put* 'PASV
    '
    175 *get* '150 Binary data connection
    '
    176 *resp* '150 Binary data connection'
    177 *cmd* 'STOR 51010000491320000001/Thread_2_0.jpg'
    178 *put* 'STOR 51010000491320000001/Thread_2_0.jpg
    '
    179 *get* '227 Entering Passive Mode(10,1,1,61,145,53)
    '
    180 *resp* '227 Entering Passive Mode(10,1,1,61,145,53)'
    181 *cmd* 'STOR 51010000491320000001/Thread_1_0.jpg'
    182 *put* 'STOR 51010000491320000001/Thread_1_0.jpg
    '
    183 *get* '150 Binary data connection
    '
    184 *resp* '150 Binary data connection'
    185 *get* '227 Entering Passive Mode(10,1,1,61,162,27)
    '
    186 *resp* '227 Entering Passive Mode(10,1,1,61,162,27)'
    187 *get* '227 Entering Passive Mode(10,1,1,61,146,15)
    '
    188 *resp* '227 Entering Passive Mode(10,1,1,61,146,15)'
    189 *get* '227 Entering Passive Mode(10,1,1,61,156,4)
    '
    190 *resp* '227 Entering Passive Mode(10,1,1,61,156,4)'
    191 *get* '150 Binary data connection
    '
    192 *resp* '150 Binary data connection'
    193 *get* '150 Binary data connection
    '
    194 *resp* '150 Binary data connection'
    195 *cmd* 'STOR 51010000491320000001/Thread_5_0.jpg'
    196 *put* 'STOR 51010000491320000001/Thread_5_0.jpg
    '
    197 *cmd* 'STOR 51010000491320000001/Thread_4_0.jpg'
    198 *put* 'STOR 51010000491320000001/Thread_4_0.jpg
    '
    199 *get* '331 need password
    '
    200 *resp* '331 need password'
    201 *cmd* 'PASS *****'
    202 *put* 'PASS *****
    '
    203 *get* '150 Binary data connection
    '
    204 *resp* '150 Binary data connection'
    205 *get* '150 Binary data connection
    '
    206 *resp* '150 Binary data connection'
    207 *cmd* 'STOR 51010000491320000001/Thread_6_0.jpg'
    208 *put* 'STOR 51010000491320000001/Thread_6_0.jpg
    '
    209 *get* '150 Binary data connection
    '
    210 *resp* '150 Binary data connection'
    211 *get* '230 welcome to my ftp!
    '
    212 *resp* '230 welcome to my ftp!'
    213 *cmd* 'STOR 51010000491320000001/Thread_3_0.jpg'
    214 *put* 'STOR 51010000491320000001/Thread_3_0.jpg
    '
    215 *get* '150 Binary data connection
    '
    216 *resp* '150 Binary data connection'
    217 *cmd* 'TYPE I'
    218 *put* 'TYPE I
    '
    219 *get* '200 TYPE set to I.
    '
    220 *resp* '200 TYPE set to I.'
    221 *cmd* 'PASV'
    222 *put* 'PASV
    '
    223 *get* '150 Binary data connection
    '
    224 *resp* '150 Binary data connection'
    225 *get* '227 Entering Passive Mode(10,1,1,61,143,118)
    '
    226 *resp* '227 Entering Passive Mode(10,1,1,61,143,118)'
    227 *cmd* 'STOR 51010000491320000001/Thread_9_0.jpg'
    228 *put* 'STOR 51010000491320000001/Thread_9_0.jpg
    '
    229 *get* '150 Binary data connection
    '
    230 *resp* '150 Binary data connection'
    231 *get* '226 transfer complete
    '
    232 *resp* '226 transfer complete'
    233 *get* '226 transfer complete
    '
    234 *resp* '226 transfer complete'
    235 *get* '226 transfer complete
    '
    236 *resp* '226 transfer complete'
    237 *get* '226 transfer complete
    '
    238 *resp* '226 transfer complete'
    239 *get* '226 transfer complete
    '
    240 *resp* '226 transfer complete'
    241 *get* '226 transfer complete
    '
    242 *resp* '226 transfer complete'
    243 *get* '226 transfer complete
    '
    244 *resp* '226 transfer complete'
    245 *get* '226 transfer complete
    '
    246 *resp* '226 transfer complete'
    247 *get* '226 transfer complete
    '
    248 *resp* '226 transfer complete'
    249 *get* '226 transfer complete
    '
    250 *resp* '226 transfer complete'
    251 Thread_7: count=25
    252 end:Thread_7
    253 Thread_5: count=25
    254 end:Thread_5
    255 Thread_2: count=25
    256 end:Thread_2
    257 Thread_9: count=25
    258 end:Thread_9
    259 Thread_3: count=25
    260 end:Thread_3
    261 Thread_4: count=25
    262 end:Thread_4
    263 Thread_6: count=25
    264 end:Thread_6
    265 Thread_8: count=25
    266 end:Thread_8
    267 Thread_0: count=25
    268 end:Thread_0
    269 Thread_1: count=25
    270 end:Thread_1
    271 ['ftp2_threading_1.py']
    272 main exit...
    273 g_count=250

    每次更改循环次数有点low,加入命令行参数,代码中的: 93 #for i in range(0,int(sys.argv[1])):

    取消注释

    在终端输入:python3 ftp_threading.py 1000(循环次数)即可

    在终端查看:存入了多少个文件:find . -type f -print|wc -l

  • 相关阅读:
    POJ 2112 Optimal Milking (Dinic + Floyd + 二分)
    POJ 3678 Katu Puzzle (2-SAT)
    超详细的Java面试题总结(一)之Java基础知识篇
    Java高级面试题及答案
    Java线程面试题 Top 50
    Java面试题收集
    Spring基础使用(一)--------IOC、Bean的XML方式装配
    你不知道的Javascript:有趣的setTimeout
    Java 10 的 10 个新特性,将彻底改变你写代码的方式!
    深入理解 Java 多线程核心知识:跳槽面试必备
  • 原文地址:https://www.cnblogs.com/ranxf/p/7885493.html
Copyright © 2011-2022 走看看