项目中研发人员自己写了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. 【BZOJ3572】[Hnoi2014]世界树 虚树

    [BZOJ3572][Hnoi2014]世界树 Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森 ...

  2. Block Formatting Contexts (块级格式化上下文) 使用参考

    转自:http://kayosite.com/block-formatting-contexts-in-detail.html 在上文<详说清除浮动>中,Kayo 较为详细地介绍了 BFC ...

  3. PhoneGap在Mac环境下使用问题小结

    PhoneGap在Mac环境下使用问题小结1,问题一:在执行命令phonegap run ios出现“Cordova needs ios-sim version 1.7 or greater, you ...

  4. 【转载】Java并发编程:volatile关键字解析

    http://www.cnblogs.com/dolphin0520/p/3920373.html

  5. 巨蟒python全栈开发flask12项目开始4

    1.App实现录音功能 2.App上传录音 3.Toy消息提醒+消息存储 4.Toy收取消息 5.Chat页面完善&&本地播放&&网络播放&&获取聊天记 ...

  6. java讲讲几种常见的排序算法(二)

    java讲讲几种常见的排序算法(二) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 堆排序 思路:构建一个小顶堆,小顶堆就是棵二叉树,他的左右孩子均大于他的根节点( ...

  7. andriod的apk文件相关的编译反编译工具

    1.smali-1.2.6.jar 用途:.smali文件 转成 classes.dex文件 说明:.smali文件,类似于.class文件,可以用普通文本编辑器查看和修改. 用法举例:命令行:jav ...

  8. python基础-第七篇-7.4异常处理

    异常基础: 异常处理首先要捕获异常,不让程序中断,也不让错误信息直接呈现出来,然后就是你该怎么处理异常,以什么方式显示 try: pass except Exception,ex: pass 在需要用 ...

  9. 剑指Offer——二叉树中和为某一值的路径

    题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 分析: 先序遍历二叉树,找到二叉树中结点值的和 ...

  10. 原!linux脚本 expect命令 完成 输入密码交互 进行scp远程文件拷贝

    1.安装expect yum install  expect expect相关知识--- https://blog.csdn.net/lufeisan/article/details/53488395 ...