Загрузка и загрузка с использованием onedrive business одновременно с несколькими одновременными запросами занимает много времени - PullRequest
0 голосов
/ 15 мая 2019

Я хочу конвертировать мой docx в pdf с помощью onedrive, поэтому я загрузил свой 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 голосов
/ 17 мая 2019

Несколько моментов, которые вы можете учитывать при реализации таких функций

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) И, наконец, самое главное, реализовать многопоточность при загрузке файлов. Многопоточность должна быть реализована и при загрузке файлов.

Проверьте эту ссылку для многопоточности в python.

Или попробуйте this .

Справка:

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

Надеюсь, это поможет.

...