同时使用onedrive业务上载和下载多个请求,同时花费大量时间

时间:2019-05-15 04:52:20

标签: python django azure sharepoint onedrive

我想使用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 个答案:

答案 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/

希望这会有所帮助。