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