Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从csv列表加速Python请求_Python_Multithreading_Python Requests - Fatal编程技术网

从csv列表加速Python请求

从csv列表加速Python请求,python,multithreading,python-requests,Python,Multithreading,Python Requests,下面是我对Python的第一次尝试。我有一个csv文件,上面列出了客户的工作编号。我正在对我们的(第三方)工作管理系统进行3次api调用。1获取实际作业编号,2获取作业阶段,3获取作业状态(如下)。我有一个vb.net应用程序,可以将这些结果全部分离,将它们与其他数据混合,并将它们添加到MYSQL数据中,以便在Ruby仪表板等上进行报告。API调用的繁重工作是在excel vba中完成的,因为我可以在一个地方完成所有工作。API调用很慢,非常慢,所以我们想办法加快这个过程,Python突然出现了

下面是我对Python的第一次尝试。我有一个csv文件,上面列出了客户的工作编号。我正在对我们的(第三方)工作管理系统进行3次api调用。1获取实际作业编号,2获取作业阶段,3获取作业状态(如下)。我有一个vb.net应用程序,可以将这些结果全部分离,将它们与其他数据混合,并将它们添加到MYSQL数据中,以便在Ruby仪表板等上进行报告。API调用的繁重工作是在excel vba中完成的,因为我可以在一个地方完成所有工作。API调用很慢,非常慢,所以我们想办法加快这个过程,Python突然出现了。对下面的内容进行排序,并从.net调用,但速度仍然很慢。这三个电话总共大约需要5分钟。我们只看到大约60到70个工作岗位。第一次调用job number确实带来了一个大的json文件,但不幸的是,在第二次和第三次调用中没有我需要的数据,因此我无法通过删除2和3来加快它的速度

由于我刚刚跳进Python head的第一步,我无法轻松地找到解决方案。我一直在看关于多线程、多处理的帖子,但都是一些有半点线索的人问我的,我只是还没到那里

非常感谢您的帮助

导入请求
导入csv
以open(“C:\\******.csv”)作为csvfile:
readCSV=csv.reader(csvfile,分隔符=“,”)
工作=[]
阶段=[]
outfile=open(“C:\\**********另一个******.csv”,“w”)
对于readCSV中的行:
作业=行[0]
url=(
“https://*********.com/api/v1.0/companys/**/jobs/”
+工作
+“?列=状态”
)
auth_token=“********”
有效载荷=“”
标题={
“内容类型”:“application/json x-www-form-urlencoded”,
“授权”:“持票人*******”,
“接受”:“*/*”,
“缓存控制”:“无缓存”,
“主机”:“******”,
“接受编码”:“gzip,deflate”,
“连接”:“保持活动状态”,
“缓存控制”:“无缓存”,
}
response=requests.request(
“获取”,url,数据=有效负载,标题=标题
)
Stage=response.text
打印((作业,阶段),文件=输出文件)
关闭

类似这样的操作应该可以让您在获取作业时进行多处理

其思想是将从CSV获取作业重构为一个生成器函数,然后将访问API的函数重构为另一个

(因为您显然是在Windows上,所以需要使用
main()
函数和
if-main
保护,并使用
多处理

导入请求
导入csv
导入多处理
sess=requests.Session()
标题={
“接受”:“*/*”,
“接受编码”:“gzip,deflate”,
“授权”:“持票人*******”,
“缓存控制”:“无缓存”,
“主机”:“******”,
}
def read_jobs():
以open(“C:\\******.csv”)作为csvfile:
对于csv.reader(csvfile,分隔符=“,”)中的行:
产量行[0]
def get_job_状态(作业):
url=(
“https://*********.com/api/v1.0/companys/**/jobs/”
+工作
+“?列=状态”
)
response=requests.request(
method=“GET”,url=url,headers=headers
)
打印(“得到工作”,工作)
返回(作业、响应、文本)
def main():
以open(“C:\**********另一个******.csv”,“w”)作为输出文件:
将multiprocessing.Pool()用作池:
对于pool.imap_中的结果,未排序(
获取作业状态,读取作业()
):
打印(结果,文件=输出文件)
如果名称=“\uuuuu main\uuuuuuuu”:
main()

多处理取决于核数。在您的情况下,线程就是您所需要的。线程的最简单接口是ThreadPool。例如:

from multiprocessing.pool import ThreadPool

threads_count = 10
pool = ThreadPool(threads_count)

def do_job(url)
    return requests.get(url)

urls = ['url1', 'url2']

pool.map(do_job, urls)

pool.close()
pool.join()

您的代码仅显示发出一个
GET
请求。是否所有3个请求都需要按顺序进行?另请注意,您正在寻找多线程而不是多处理,因为这是一个I/O绑定task@aws_apprentice代码正在对从CSV文件读取的每个
作业执行一个GET请求,因此,CSV文件中的行数与发生的请求数一样多。三个请求中的每一个都非常相同,状态和阶段调用都相同。第一次调用作业编号时,会将其分开,以获取第二次和第三次调用的数据。1和2以及2和3之间存在延迟,因此可以对生成的文件进行其他处理。这真的只是我第一次尝试的每个个人请求所需的时间,所以我希望在这方面提供一些建议和指导,能够解决其他两个问题。感谢AKX,它确实为事情增加了一些速度,并给了我一个在知识基础上建立一点的机会。非常感谢。