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

 #!/usr/bin/python3
from ftplib import FTP
import time
import threading
import random
import sys threadLock = threading.Lock()
g_count = 0 def ftpconnect(host, username, password):
ftp = FTP()
ftp.set_debuglevel(2)
ftp.connect(host, 2008)
ftp.login(username, password)
return ftp def downloadfile(ftp, remotepath, localpath):
bufsize = 1024
fp = open(localpath, 'wb')
ftp.retrbinary('RETR ' + remotepath, fp.write, bufsize)
ftp.set_debuglevel(0)
fp.close() def uploadfile(ftp, localpath, remotepath):
bufsize = 1024
fp = open(localpath, 'rb')
ftp.storbinary('STOR ' + remotepath, fp, bufsize)
ftp.set_debuglevel(0)
fp.close() # def print_time(threadName, delay, counter):
# while counter:
# time.sleep(delay)
# print("%s: %s" % (threadName, time.ctime(time.time())))
# counter -= 1 def testuploadfile(threadName):
global threadLock
global g_count
ftp = ftpconnect("10.1.1.61", "admin", "admin")
start_tick = time.time()
count = 0
while True:
pic_name = '51010000491320000001/' + threadName + '_' + str(count) + '.jpg'
uploadfile(ftp, "/home/xzrs/ftp/face1.jpg", pic_name)
end_tick = time.time()
count = count + 1
if (end_tick - start_tick) > 1.0:
break
ftp.quit()
print(threadName+': count='+str(count))
threadLock.acquire()
g_count = g_count + count
threadLock.release() def virtualUploadFile():
global threadLock
global g_count
start_tick = time.time()
count = 0
while True:
num = random.random()
time.sleep(num)
end_tick = time.time()
count = count + 1
if (end_tick - start_tick) > 1.0:
break
threadLock.acquire()
g_count = g_count + count
threadLock.release() class MyThread(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name def run(self):
print("start:"+self.name)
testuploadfile(self.name)
# virtualUploadFile()
print("end:"+self.name) if __name__ == "__main__":
threadList = []
#for i in range(0,int(sys.argv[1])):
for i in range(0,10):
thread = MyThread(i, "Thread_" + str(i))
thread.start()
threadList.append(thread)
for t in threadList:
t.join()
print(sys.argv)
print("main exit...")
print('g_count='+str(g_count))

在服务器终端运行结果:

python3 ftp_threading.py |tee  log.log

 start:Thread_0
start:Thread_1
start:Thread_2
start:Thread_3
start:Thread_4
start:Thread_5
start:Thread_6
start:Thread_7
*get* '220 welcome\n'
*resp* '220 welcome'
*cmd* 'USER admin'
*put* 'USER admin\r\n'
start:Thread_8
*get* '220 welcome\n'
*resp* '220 welcome'
*cmd* 'USER admin'
*put* 'USER admin\r\n'
*get* '331 need password\n'
*resp* '331 need password'
*cmd* 'PASS *****'
*put* 'PASS *****\r\n'
*get* '220 welcome\n'
*resp* '220 welcome'
*cmd* 'USER admin'
*put* 'USER admin\r\n'
*get* '230 welcome to my ftp!\n'
*resp* '230 welcome to my ftp!'
start:Thread_9
*get* '220 welcome\n'
*resp* '220 welcome'
*cmd* 'USER admin'
*put* 'USER admin\r\n'
*get* '331 need password\n'
*resp* '331 need password'
*cmd* 'PASS *****'
*put* 'PASS *****\r\n'
*get* '220 welcome\n'
*resp* '220 welcome'
*cmd* 'USER admin'
*put* 'USER admin\r\n'
*cmd* 'TYPE I'
*put* 'TYPE I\r\n'
*get* '331 need password\n'
*resp* '331 need password'
*cmd* 'PASS *****'
*put* 'PASS *****\r\n'
*get* '220 welcome\n'
*resp* '220 welcome'
*cmd* 'USER admin'
*put* 'USER admin\r\n'
*get* '230 welcome to my ftp!\n'
*resp* '230 welcome to my ftp!'
*get* '220 welcome\n'
*resp* '220 welcome'
*cmd* 'USER admin'
*put* 'USER admin\r\n'
*get* '200 TYPE set to I.\n'
*resp* '200 TYPE set to I.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '220 welcome\n'
*resp* '220 welcome'
*cmd* 'USER admin'
*put* 'USER admin\r\n'
*get* '331 need password\n'
*resp* '331 need password'
*cmd* 'PASS *****'
*put* 'PASS *****\r\n'
*get* '230 welcome to my ftp!\n'
*resp* '230 welcome to my ftp!'
*get* '331 need password\n'
*resp* '331 need password'
*cmd* 'PASS *****'
*put* 'PASS *****\r\n'
*get* '331 need password\n'
*resp* '331 need password'
*cmd* 'PASS *****'
*put* 'PASS *****\r\n'
*get* '331 need password\n'
*resp* '331 need password'
*cmd* 'PASS *****'
*put* 'PASS *****\r\n'
*get* '331 need password\n'
*resp* '331 need password'
*cmd* 'PASS *****'
*put* 'PASS *****\r\n'
*cmd* 'TYPE I'
*put* 'TYPE I\r\n'
*get* '230 welcome to my ftp!\n'
*resp* '230 welcome to my ftp!'
*get* '230 welcome to my ftp!\n'
*resp* '230 welcome to my ftp!'
*cmd* 'TYPE I'
*put* 'TYPE I\r\n'
*get* '230 welcome to my ftp!\n'
*resp* '230 welcome to my ftp!'
*get* '220 welcome\n'
*resp* '220 welcome'
*cmd* 'USER admin'
*put* 'USER admin\r\n'
*get* '230 welcome to my ftp!\n'
*resp* '230 welcome to my ftp!'
*get* '230 welcome to my ftp!\n'
*resp* '230 welcome to my ftp!'
*get* '200 TYPE set to I.\n'
*resp* '200 TYPE set to I.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*cmd* 'TYPE I'
*put* 'TYPE I\r\n'
*get* '227 Entering Passive Mode(10,1,1,61,173,162)\n'
*resp* '227 Entering Passive Mode(10,1,1,61,173,162)'
*cmd* 'TYPE I'
*put* 'TYPE I\r\n'
*get* '200 TYPE set to I.\n'
*resp* '200 TYPE set to I.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*cmd* 'TYPE I'
*put* 'TYPE I\r\n'
*cmd* 'TYPE I'
*put* 'TYPE I\r\n'
*cmd* 'TYPE I'
*put* 'TYPE I\r\n'
*get* '200 TYPE set to I.\n'
*resp* '200 TYPE set to I.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '331 need password\n'
*resp* '331 need password'
*cmd* 'PASS *****'
*put* 'PASS *****\r\n'
*get* '200 TYPE set to I.\n'
*resp* '200 TYPE set to I.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '200 TYPE set to I.\n'
*resp* '200 TYPE set to I.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '200 TYPE set to I.\n'
*resp* '200 TYPE set to I.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '200 TYPE set to I.\n'
*resp* '200 TYPE set to I.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '230 welcome to my ftp!\n'
*resp* '230 welcome to my ftp!'
*get* '227 Entering Passive Mode(10,1,1,61,181,118)\n'
*resp* '227 Entering Passive Mode(10,1,1,61,181,118)'
*get* '227 Entering Passive Mode(10,1,1,61,132,196)\n'
*resp* '227 Entering Passive Mode(10,1,1,61,132,196)'
*cmd* 'TYPE I'
*put* 'TYPE I\r\n'
*get* '227 Entering Passive Mode(10,1,1,61,165,174)\n'
*resp* '227 Entering Passive Mode(10,1,1,61,165,174)'
*cmd* 'STOR 51010000491320000001/Thread_8_0.jpg'
*put* 'STOR 51010000491320000001/Thread_8_0.jpg\r\n'
*get* '227 Entering Passive Mode(10,1,1,61,156,145)\n'
*resp* '227 Entering Passive Mode(10,1,1,61,156,145)'
*cmd* 'STOR 51010000491320000001/Thread_0_0.jpg'
*put* 'STOR 51010000491320000001/Thread_0_0.jpg\r\n'
*get* '220 welcome\n'
*resp* '220 welcome'
*cmd* 'USER admin'
*put* 'USER admin\r\n'
*cmd* 'STOR 51010000491320000001/Thread_7_0.jpg'
*put* 'STOR 51010000491320000001/Thread_7_0.jpg\r\n'
*get* '200 TYPE set to I.\n'
*resp* '200 TYPE set to I.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '150 Binary data connection\n'
*resp* '150 Binary data connection'
*cmd* 'STOR 51010000491320000001/Thread_2_0.jpg'
*put* 'STOR 51010000491320000001/Thread_2_0.jpg\r\n'
*get* '227 Entering Passive Mode(10,1,1,61,145,53)\n'
*resp* '227 Entering Passive Mode(10,1,1,61,145,53)'
*cmd* 'STOR 51010000491320000001/Thread_1_0.jpg'
*put* 'STOR 51010000491320000001/Thread_1_0.jpg\r\n'
*get* '150 Binary data connection\n'
*resp* '150 Binary data connection'
*get* '227 Entering Passive Mode(10,1,1,61,162,27)\n'
*resp* '227 Entering Passive Mode(10,1,1,61,162,27)'
*get* '227 Entering Passive Mode(10,1,1,61,146,15)\n'
*resp* '227 Entering Passive Mode(10,1,1,61,146,15)'
*get* '227 Entering Passive Mode(10,1,1,61,156,4)\n'
*resp* '227 Entering Passive Mode(10,1,1,61,156,4)'
*get* '150 Binary data connection\n'
*resp* '150 Binary data connection'
*get* '150 Binary data connection\n'
*resp* '150 Binary data connection'
*cmd* 'STOR 51010000491320000001/Thread_5_0.jpg'
*put* 'STOR 51010000491320000001/Thread_5_0.jpg\r\n'
*cmd* 'STOR 51010000491320000001/Thread_4_0.jpg'
*put* 'STOR 51010000491320000001/Thread_4_0.jpg\r\n'
*get* '331 need password\n'
*resp* '331 need password'
*cmd* 'PASS *****'
*put* 'PASS *****\r\n'
*get* '150 Binary data connection\n'
*resp* '150 Binary data connection'
*get* '150 Binary data connection\n'
*resp* '150 Binary data connection'
*cmd* 'STOR 51010000491320000001/Thread_6_0.jpg'
*put* 'STOR 51010000491320000001/Thread_6_0.jpg\r\n'
*get* '150 Binary data connection\n'
*resp* '150 Binary data connection'
*get* '230 welcome to my ftp!\n'
*resp* '230 welcome to my ftp!'
*cmd* 'STOR 51010000491320000001/Thread_3_0.jpg'
*put* 'STOR 51010000491320000001/Thread_3_0.jpg\r\n'
*get* '150 Binary data connection\n'
*resp* '150 Binary data connection'
*cmd* 'TYPE I'
*put* 'TYPE I\r\n'
*get* '200 TYPE set to I.\n'
*resp* '200 TYPE set to I.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '150 Binary data connection\n'
*resp* '150 Binary data connection'
*get* '227 Entering Passive Mode(10,1,1,61,143,118)\n'
*resp* '227 Entering Passive Mode(10,1,1,61,143,118)'
*cmd* 'STOR 51010000491320000001/Thread_9_0.jpg'
*put* 'STOR 51010000491320000001/Thread_9_0.jpg\r\n'
*get* '150 Binary data connection\n'
*resp* '150 Binary data connection'
*get* '226 transfer complete\n'
*resp* '226 transfer complete'
*get* '226 transfer complete\n'
*resp* '226 transfer complete'
*get* '226 transfer complete\n'
*resp* '226 transfer complete'
*get* '226 transfer complete\n'
*resp* '226 transfer complete'
*get* '226 transfer complete\n'
*resp* '226 transfer complete'
*get* '226 transfer complete\n'
*resp* '226 transfer complete'
*get* '226 transfer complete\n'
*resp* '226 transfer complete'
*get* '226 transfer complete\n'
*resp* '226 transfer complete'
*get* '226 transfer complete\n'
*resp* '226 transfer complete'
*get* '226 transfer complete\n'
*resp* '226 transfer complete'
Thread_7: count=25
end:Thread_7
Thread_5: count=25
end:Thread_5
Thread_2: count=25
end:Thread_2
Thread_9: count=25
end:Thread_9
Thread_3: count=25
end:Thread_3
Thread_4: count=25
end:Thread_4
Thread_6: count=25
end:Thread_6
Thread_8: count=25
end:Thread_8
Thread_0: count=25
end:Thread_0
Thread_1: count=25
end:Thread_1
['ftp2_threading_1.py']
main exit...
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

python3_ftp多线程上传图片的更多相关文章

  1. java使用ftp局域网内多线程上传图片过慢

    多线程ftp上传文件时候,图片上传很慢,调试和查询资料发现主要在:storeFile方法 解决方案如下: FTPClient fc设置setBufferSize 可以根据内存大小适当设置大点的缓冲区: ...

  2. Java:网络编程之应用实例

    1.聊天 编写一个聊天程序,有收数据的部分和发数据的部分. 这两部分需要同时执行,那么就需要多线程技术. 一个线程控制发送. 一个线程控制接收. 因为收和发动作是不一致的,所以要定义两个run方法,而 ...

  3. Typora多线程批量上传图片,永久免费25G图床

    为了满足日常需求,就写了一个自动上传图片到图床的脚本 运行该程序可以做到自动完成图片上传,并自动替换为网络链接,支持多图同时上传,采用了多线程,上传速度提升很明显. 以Window系统为例,操作步骤: ...

  4. [Xcode 实际操作]八、网络与多线程-(17)使用网址会话对象URLSession向远程服务器上传图片

    目录:[Swift]Xcode实际操作 本文将演示如何通过网址会话对象URLSession向远程服务器上传图片. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的代理模 ...

  5. -Android -线程池 批量上传图片 -附php接收代码

    (出处:http://www.cnblogs.com/linguanh/) 目录: 1,前序 2,类特点 3,用法 4,java代码 5,php代码 1,前序 还是源于重构,看着之前为赶时间写着的碎片 ...

  6. iOS多线程学习

    在 iOS 中其实目前有 4 套多线程方案,他们分别是: Pthreads NSThread GCD NSOperation & NSOperationQueue 所以接下来,我会一一讲解这些 ...

  7. iOS多线程

    关于iOS多线程 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方 ...

  8. iOS多线程解析

    在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项.当然也会给出几种多线程的案例,在实际使用中感受它们的区别.还有一点需要说明的是,这篇文章将会使用 Swift 和 ...

  9. php多线程抓取信息测试例子

    php多线程抓取信息测试例子 PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程.多线程在处理重复性的循环任务,能够大大缩短程序执行时间. PHP扩展下载:htt ...

随机推荐

  1. 剑指offer 29 多于一半的数

    1. 思路比较简单, 每次从数组中抽出两个数, 若是不同则丢弃两个数, 最后剩下的数即为所求 2. 书中给出的代码实现比较巧妙. 遍历数组中的元素, 变量 result 记录当前元素, time 记录 ...

  2. OpenSSL学习笔记

    SSL缺省只进行server端的认证,客户端的认证是可选的.以下是其流程图(摘自TLS协议). 加密算法介绍: 对称加密: DES:date encrption standard,56bit 3DES ...

  3. tableview直接滚动至最后一行

    类似聊天界面,tableview应该直接显示在最后一行,并且不应该有滚动的出现. 在网上查了很久,直接滚动至最后一行很容易实现,有两种方法比较好. 1. 调用scrollToRowAtIndexPat ...

  4. 常用CGI环境变量 转自https://blog.csdn.net/acmdream/article/details/58070066

    CGI环境变量名称 说明 REQUEST_METHOD 请求类型,如“GET”或“POST” CONTENT_TYPE 被发送数据的类型 CONTENT_LENGTH 客户端向标准输入设备发送的数据长 ...

  5. freeipa未授权遍历注册账户漏洞

    一.freeipa简介: freeipa是一款集成的安全信息管理解决方案.freeipa包含Linux (Fedora),389 Directory Server MIT Kerberos, NTP, ...

  6. make_ext4fs 失败

    root@fengyun-server:/home/fmake_ext4fsengyun/android/reverse_engineer/rom制作# ./make_ext4fs -l 700M - ...

  7. 如何做rom,体验做rom过程,附图文教程,感谢各位romer

    http://bbs.gfan.com/android-5408130-1-1.html 有人问我,我简单的写一下,来源XDA,运行环境ubuntu 10.4. ubuntu安装很简单,在window ...

  8. css calc()

    w https://developer.mozilla.org/en-US/docs/Web/CSS/calc The calc() CSS function can be used anywhere ...

  9. 服务器端Session和客户端Session(和Cookie区别)2

    https://blog.csdn.net/java_faep/article/details/78082802 我们可以得出如下结论: 关闭浏览器,只会是浏览器端内存里的session cookie ...

  10. Yii框架2.0的控制器

    控制器是继承[[yii\base\Controller]]类的对象,负责处理请求和生成响应. 具体来说,控制器从应用主体接管控制后会分析请求数据并传送到模型, 传送模型结果到视图,最后生成输出响应信息 ...