我想在我们的一个Web服务器上进行一些性能测试,以查看服务器如何处理大量持久连接.不幸的是,我对HTTP和Web测试并不十分熟悉.这是我迄今为止获得的Python代码:
import http.client
import argparse
import threading
def make_http_connection():
conn = http.client.HTTPConnection(options.server, timeout=30)
conn.connect()
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("num", type=int, help="Number of connections to make (integer)")
parser.add_argument("server", type=str, help="Server and port to connect to. Do not prepend \'http://\' for this")
options = parser.parse_args()
for n in range(options.num):
connThread = threading.Thread(target = make_http_connection, args = ())
connThread.daemon = True
connThread.start()
while True:
try:
pass
except KeyboardInterrupt:
break
Run Code Online (Sandbox Code Playgroud)
我的主要问题是:如何保持这些连接存活?我设置了一个很长的超时,但这是一个非常粗糙的方法,我甚至不确定它会影响连接.只需要每隔一段时间请一个字节或两个字节吗?
(另外,在一个不相关的说明中,有没有比while True:我代码末尾的丑陋块更好的等待键盘中断的程序?)
我正在编写一个程序,旨在在Active Directory中生成大量活动,以对另一个软件进行压力测试.要创建用户,我正在创建一个简单的类
class ADUser(object):
def __init__(self):
self.firstname = self.firstname() # returns a random name from a big list
self.lastname = self.lastname() # returns a random name from a big list
self.fullname = self.firstname + " " + self.lastname
self.employeeid = ??? # an incrementing integer... somehow
Run Code Online (Sandbox Code Playgroud)
这是employeeid给我带来麻烦的属性.我喜欢每次创建用户对象时有这样的增量-这将保证一个唯一的ID号,帮我记录下来的活动.但是,我不确定如何在课堂上这样做.我能做到这一点以外的类易足以与一个for循环,但是这似乎并不像干净的或最"Python化"方法.
这可能是一个简单的问题,但它一直困扰着我.
我被要求处理外部REST API(实际上是Zendesk),其凭据需要格式化为{email}/token:{security_token}- 单个值而不是通常的用户名/密码对.我正在尝试使用Python requests模块执行此任务,因为它是Pythonic并且不会伤害我的大脑,但我不确定如何格式化身份验证凭据.Zendesk文档仅提供使用的访问示例curl,我不熟悉.
这是我目前的requests.auth.AuthBase子类:
class ZDTokenAuth(requests.auth.AuthBase):
def __init__(self,username,token):
self.username = username
self.token = token
def __call__(self,r):
auth_string = self.username + "/token:" + self.token
auth_string = auth_string.encode('utf-8')
r.headers['Authorization'] = base64.b64encode(auth_string)
return r
Run Code Online (Sandbox Code Playgroud)
我不确定是否需要各种编码,但这就是有人在github上做的事情(https://github.com/skipjac/Zendesk-python-api/blob/master/zendesk-ticket-delete.py)所以为什么不.我当然没有编码也尝试过 - 当然 - 结果相同.
这是我用来测试这个的类和方法:
class ZDStats(object):
api_base = "https://mycompany.zendesk.com/api/v2/"
def __init__(self,zd_auth):
self.zd_auth = zd_auth # this is assumed to be a ZDTokenAuth object
def testCredentials(self):
zd_users_url = self.api_base + "users.json"
zdreq = requests.get(zd_users_url, auth=self.zdauth)
return zdreq
Run Code Online (Sandbox Code Playgroud)
这称为: …
在尝试从列表中删除不以特定子字符串开头的所有文件名时,我遇到了以下意外行为:
>>> allfiles = os.listdir(mydir)
>>> allfiles
['dwcpybyext.sh', 'dwlaunch', 'libupdate.sh', 'ntpsync.sh']
>>> for f in allfiles:
... if f.startswith('n') == False:
... allfiles.remove(f)
...
>>> allfiles
['dwlaunch', 'ntpsync.sh']
Run Code Online (Sandbox Code Playgroud)
从理论上讲,这应该已经删除了不从列表开始的每个文件名'n'.相反,它留'd'在列表中的一个开头.如果我改变循环使用if f.startswith('d') == False:我得到['dwcpybyext.sh', 'dwlaunch', 'ntpsync.sh']- 最后一项甚至不包含一个'd'字符.
为什么我看到这种行为?它似乎不太可能是Python list.remove()方法中的错误- 如果我替换del allfiles[allfiles.index(f)],我会得到相同的行为,并且.remove()基本上只是一个别名.