为python中的每个HTTP请求创建新的TCP连接

时间:2015-03-27 08:50:06

标签: python centos urllib2 python-multiprocessing

对于我的大学项目,我正在尝试开发基于python的流量生成器。我在vmware上创建了2台CentOS机器,我使用1作为我的客户端,1作为我的服务器机器。我使用IP别名技术仅使用单个客户端/服务器机器来增加客户端和服务器的数量。到目前为止,我已在我的客户端计算机上创建了50个IP别名,并在我的服务器计算机上创建了10个IP别名。我还使用多处理模块从所有50个客户端到所有10个服务器同时生成流量。我还在我的服务器上开发了几个配置文件(1kb,10kb,50kb,100kb,500kb,1mb)(因为我使用的是Apache服务器,所以在/ var / www / html目录中)我正在使用urllib2向这些配置文件发送请求我的客户端机器。在我监视TCP连接数时运行脚本时,它总是<50。我想把它增加到10000.我怎么做到这一点?我认为如果为每个新的http请求建立新的TCP连接,那么就可以实现这个目标。我在正确的道路上吗?如果不善意指导我正确的道路。

        '''
Traffic Generator Script:

 Here I have used IP Aliasing to create multiple clients on single vm machine. 
 Same I have done on server side to create multiple servers. I have around 50 clients and 10 servers
'''
import multiprocessing
import urllib2
import random
import myurllist    #list of all destination urls for all 10 servers
import time
import socbindtry   #script that binds various virtual/aliased client ips to the script
response_time=[]    #some shared variables
error_count=multiprocessing.Value('i',0)
def send_request3():    #function to send requests from alias client ip 1
    opener=urllib2.build_opener(socbindtry.BindableHTTPHandler3)    #bind to alias client ip1
    try:
    tstart=time.time()
    for i in range(myurllist.url):
    x=random.choice(myurllist.url[i])
    opener.open(x).read()
    print "file downloaded:",x
    response_time.append(time.time()-tstart)
    except urllib2.URLError, e:
    error_count.value=error_count.value+1
def send_request4():    #function to send requests from alias client ip 2
    opener=urllib2.build_opener(socbindtry.BindableHTTPHandler4)    #bind to alias client ip2
    try:
    tstart=time.time()
    for i in range(myurllist.url):
    x=random.choice(myurllist.url[i])
    opener.open(x).read()
    print "file downloaded:",x
    response_time.append(time.time()-tstart)
    except urllib2.URLError, e:
    error_count.value=error_count.value+1
#50 such functions are defined here for 50 clients
process=[]
def func():
    global process
    process.append(multiprocessing.Process(target=send_request3))
    process.append(multiprocessing.Process(target=send_request4))
    process.append(multiprocessing.Process(target=send_request5))
    process.append(multiprocessing.Process(target=send_request6))
#append 50 functions here
    for i in range(len(process)):
     process[i].start()
    for i in range(len(process)):
     process[i].join()
    print"All work Done..!!"
     return
start=float(time.time())
func()
end=float(time.time())-start
print end

1 个答案:

答案 0 :(得分:1)

对于这类事情,您可能需要创建pool工作进程。我不知道在你的用例中是否有10000个流程可行(这是一个非常雄心勃勃的目标),但你应该明确地调查这个想法。


pool 背后的基本思想是你要执行M个任务,最多同时运行N个。当其中一个工作人员完成其任务时,它就可以在另一个人工作,直到所有工作完成。一个主要的优点是,如果一些任务需要很长时间才能完成,它们不会阻止工作的整体进度(只要“慢”进程的数量是

顺便说一下,这是使用Pool

的程序的基本结构
from multiprocessing import Pool

import time
import random

def send_request(some_parameter):
    print("Do send_request", some_parameter)

    time.sleep(random.randint(1,10)) # simulate randomly long process

if __name__ == '__main__':
    pool = Pool(processes=100)

    for i in range(200):
        pool.apply_async(send_request, [i])


    print("Waiting")
    pool.close()
    pool.join()
    print("Done")

在我的系统上,这个示例程序花了19秒(实时)执行。 在我的Debian系统上,我只能在达到最大打开文件数之前一次产生超过1000个进程(给定标准ulimit -n为1024)。如果您需要如此大量的工作线程,您将不得不以某种方式提高该限制。即使这样做,正如我先说的那样,10000并发进程可能相当雄心勃勃(至少使用Python)。