同时使用 onedrive 业务上传和下载多个同时请求需要很多时间

Upload and Download using onedrive business at same time with multiple simultaneous request takes much time

我想使用 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 秒内获得所有结果。你能解释一下我哪里做错了吗?

在实现这样的功能时可以考虑几点

1) 上传后不要立即下载文件。

2) 首先有一个上传文件的操作,利用队列为上传的文件添加url,如下所示

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) 最后也是最重要的,在下载文件时执行Multi-threading。上传文件也需要实现多线程

在 python 中为 multi-threading 检查此 link

或者尝试 this

参考:

http://dag.wiee.rs/home-made/unoconv/

希望对您有所帮助。