我想使用onedrive将docx转换为pdf,所以我将docx上传到onedrive中并以相同的功能下载。我正在使用python django网络服务器。
def myfunctionname(token,filecontent):
headers = {"Content-Type": "text/plain"}
txt = fileContent
graph_client = OAuth2Session(token=token)
drive_url = "mywholeurl"
upload = graph_client.put(drive_url, data=txt, headers=headers)
download = graph_client.get(drive_url + '?format=pdf')
return download.url
上载和下载一个请求花了5秒钟,但是当我同时完成20个请求以完成所有请求时,它花了大约40秒,而并发50个请求花了我80秒左右。
我希望对于任意数量的请求都能够在5秒内获得所有结果。你能解释我在哪里做错了吗?
答案 0 :(得分:0)
在实现这种功能时您可以考虑的几点
1)上传后不要立即下载文件。
2)首先有一个上传文件的操作,并利用队列添加上传文件的网址,如下所示
import sys
import os
import urllib
import threading
from Queue import Queue
class DownloadThread(threading.Thread):
def __init__(self, queue, destfolder):
super(DownloadThread, self).__init__()
self.queue = queue
self.destfolder = destfolder
self.daemon = True
def run(self):
while True:
url = self.queue.get()
try:
self.download_url(url)
except Exception,e:
print " Error: %s"%e
self.queue.task_done()
def download_url(self, url):
# change it to a different way if you require
name = url.split('/')[-1]
dest = os.path.join(self.destfolder, name)
print "[%s] Downloading %s -> %s"%(self.ident, url, dest)
urllib.urlretrieve(url, dest)
def download(urls, destfolder, numthreads=4):
queue = Queue()
for url in urls:
queue.put(url)
for i in range(numthreads):
t = DownloadThread(queue, destfolder)
t.start()
queue.join()
if __name__ == "__main__":
download(sys.argv[1:], "/tmp")
3)最后也是最重要的一点是,在下载文件时实现多线程。在上传文件时也需要实现多线程。
选中此link以获得python中的多线程。
或者尝试this。
参考:
http://dag.wiee.rs/home-made/unoconv/
希望这会有所帮助。