【问题标题】:Create new TCP Connections for every HTTP request in python在 python 中为每个 HTTP 请求创建新的 TCP 连接
【发布时间】:2015-03-27 08:50:06
【问题描述】:

对于我的大学项目,我正在尝试开发一个基于 python 的流量生成器。我在 vmware 上创建了 2 台 CentOS 机器,我使用 1 作为我的客户端和 1 作为我的服务器机器。我使用 IP 别名技术来增加客户端和服务器的数量,只使用单个客户端/服务器机器。到目前为止,我已经在我的客户端机器上创建了 50 个 IP 别名,在我的服务器机器上创建了 10 个 IP 别名。我还使用多处理模块同时生成从所有 50 个客户端到所有 10 个服务器的流量。我还在我的服务器上开发了一些配置文件(1kb、10kb、50kb、100kb、500kb、1mb)(在 /var/www/html 目录中,因为我使用的是 Apache 服务器)并且我正在使用 urllib2 向这些配置文件发送请求我的客户端机器。在这里,当我监视 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

【问题讨论】:

  • 你真的写了(几乎)相同的代码 50 次?
  • 代码不是“完整的”(缩进...),但据我所知,您创建了 50 个进程,每个进程一次执行 1 次下载。如果这是正确的,那么您显然只有 N
  • 再补充一点:有类似 httperf [ hpl.hp.com/research/linux/httperf ] 的工具可用于此目的。
  • @KlausD。是的,我不得不...因为每次我使用不同的 ip 发送请求。我不能将 httpref 显示为我的大学项目
  • @SylvainLeroux 是的,你说的是正确的。但我想增加 TCP 连接数。

标签: python centos urllib2 python-multiprocessing


【解决方案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)。

【讨论】:

  • 但是使用池可以让我多次运行相同的功能,对吗?在这里,我想同时执行不同的功能(虽然执行相同的任务,但都使用不同的 ips)。所以我避免使用游泳池。我可以使用池来执行不同的功能吗?
  • @BhoomikaSheth 请仔细看示例:您可以将一个或多个参数传递给被调用的函数。例如,您的主机的 IP 地址,或 URL 或任何您想要的。
  • 我收到一个 RuntimeError: 同步对象只能在运行我的脚本时通过继承在进程之间共享
  • 如果我不向函数传递任何参数,那么它可以完美运行
  • @Bhoomika 由于这显然是一个不同的问题,您应该明确地提出另一个问题,以便引起足够的关注以获得有用的答案。
猜你喜欢
  • 2015-10-27
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
相关资源
最近更新 更多