我试图运行一个http POST的进程,这个进程会发送一个警报(发送警报的时间以纳秒为单位)到服务器。我试图在毫秒内测试服务器处理警报的能力。按照给定的标准,服务器据说可以处理6000次警报/秒。Python:如何在同一时刻触发多个进程
我创建一块使用多处理模块,其发送警报6000的代码,但我使用一个for循环,并因此所用的时间来执行对循环超过超过一秒。因此,所有的6000进程都不会在SAME INSTANT中触发。
有没有办法在同一时刻触发多个(N号)进程?
这是我的代码:flowtesting.py这是一个库。这也是之后进行后 '####'
进口JSON 进口httplib2的
类flowTesting()我的脚本: 高清初始化(个体经营,companyId,deviceIp): self.companyId = companyId self.deviceIp = deviceIp
def generate_savedSearchName(self, randNum):
self.randMsgId = randNum
self.savedSearchName = "TEST %s risk31 more than 3" % self.randMsgId
def def_request_body_dict(self):
self.reqBody_dict = \
{ "Header" : {"agid" : "Agent1",
"mid": self.randMsgId,
"ts" : 1253125001
},
"mp":
{
"host" : self.deviceIp,
"index" : self.companyId,
"savedSearchName" : self.savedSearchName,
}
}
self.req_body = json.dumps(self.reqBody_dict)
def get_default_hdrs(self):
self.hdrs = {'Content-type': 'application/json',
'Accept-Language': 'en-US,en;q=0.8'}
def send_request(self, sIp, method="POST"):
self.sIp = sIp
self.url = "http://%s:8080/agent/splunk/messages" % self.sIp
http_cli = httplib2.Http(timeout=180, disable_ssl_certificate_validation=True)
rsp, rsp_body = http_cli.request(uri=self.url, method=method, headers=self.hdrs, body=self.req_body)
print "rsp: %s and rsp_body: %s" % (rsp, rsp_body)
# My testScript
from flowTesting import flowTesting
import random
import multiprocessing
deviceIp = "10.31.421.35"
companyId = "CPY0000909"
noMsgToBeSent = 1000
sIp = "10.31.44.235"
uniq_msg_id_list = random.sample(xrange(1,10000), noMsgToBeSent)
def runner(companyId, deviceIp, uniq_msg_id):
proc = flowTesting(companyId, deviceIp)
proc.generate_savedSearchName(uniq_msg_id)
proc.def_request_body_dict()
proc.get_default_hdrs()
proc.send_request(sIp)
process_list = []
for uniq_msg_id in uniq_msg_id_list:
savedSearchName = "TEST-1000 %s risk31 more than 3" % uniq_msg_id
process = multiprocessing.Process(target=runner, args=(companyId,deviceIp,uniq_msg_id,))
process.start()
process.join()
process_list.append(process)
print "Process list: %s" % process_list
print "Unique Message Id: %s" % uniq_msg_id_list
简短回答:否。除非你的服务器有6000个内核来同时运行6000任务。如果你打算以快速的顺序执行它们(但不一定在同一时间),有办法。首先,你可以在这里发布相关部分的代码吗? –
即使您的计算机_does_有6000个内核,并且您的操作系统可以完美安排它们,并且您使用了例如[Barrier](http://docs.python.org/3.3/library/threading.html#barrier - 对象),让它们全部触发......它们仍然会被你的网卡,你的路由器,路上的所有路由器和服务器的网卡排队。 – abarnert
对于像这样的IO操作,根本不需要多个进程。您只需要在一个异步事件循环中从单个程序中打开多个套接字。尽管编码有点复杂。 – Keith