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

 

转载于:https://www.cnblogs.com/ranxf/p/7885493.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值