项目中研发人员自己写了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. jedispool 连 redis

    java端在使用jedispool 连接redis的时候,在高并发的时候经常卡死,或报连接异常,JedisConnectionException,或者getResource 异常等各种问题 在使用je ...

  2. centos7 docker install

    env: os :centos 7 vmware steps: 1.yum  -y install docker after installed ,using   docker version cmd ...

  3. c#基础 第二讲

    判断一个人的体重是否为标准体重 计算公式:男生:体重(kg)-身高+100=±3(在此范围内为标准体重) 女生:体重(kg)-身高+110=±3 using System; using System. ...

  4. vue兄弟组件传值

    vue中除了父子组件传值,父传子用props,子传父用$emit,有时候兄弟组件之间也需要传值 1. 先定义一个中间件,src下面新建self.js import Vue from 'vue'; le ...

  5. js数组和字符串去重复几种方法

    js数组去重复几种方法 第一种:也是最笨的吧. Array.prototype.unique1 = function () { var r = new Array(); label:for(var i ...

  6. ZOJ 3932 Handshakes

    Last week, n students participated in the annual programming contest of Marjar University. Students ...

  7. TCP requires two packet transfers to set up the connection before it can send data

    wHTTP重用现存连接来减少TCP建立时延. HTTP The Definitive Guide 4.2.3 TCP Connection Handshake Delays When you set ...

  8. Google发布机器学习术语表 (包括简体中文)

    Google 工程教育团队已经发布了多语种的 Google 机器学习术语表,该术语表中列出了一般的机器学习术语和 TensorFlow 专用术语的定义.语言版本包括西班牙语,法语,韩语和简体中文. 查 ...

  9. 病毒侵袭持续中---hdu3065(AC自动机模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 模板题,没什么好说的... #include<stdio.h> #include&l ...

  10. print文档

    文档 def print(self, *args, sep=' ', end='\n', file=None): # known special case of print ""& ...