Как заправить всю функцию? - PullRequest
0 голосов
/ 25 июня 2019

Моя цель состоит в том, чтобы переписать старую кодовую базу, чтобы функция, которая загружает URL-адреса, делала это одновременно, и я бы хотел избежать записи threading.Thread(target = func_that_downloads_things).start() везде, где эта функция в настоящее время закодирована в программе.

Если бы я мог просто сохранить большую часть старой кодовой базы, которая вместо этого читала бы func_that_downloads_things() (и включить функциональность потоков непосредственно в одну функцию, выполняющую загрузку), это было бы удивительно.

Этот код загружает все 4 URL одновременно:

import requests, threading, time

def func_that_downloads_things():
    request_method = 'GET'
    request_url = 'http://olympus.realpython.org/dice'
    r = requests.request(method=request_method, url=request_url, timeout=4)
    print(r.text + '... took ' + str(round(time.time() - thread_start_time, 4)) + " seconds to download... and threading.active_count() is at " + str(threading.active_count()))

#take the start time
thread_start_time = time.time()

#download 4 websites
threading.Thread(target = func_that_downloads_things).start()
threading.Thread(target = func_that_downloads_things).start()
threading.Thread(target = func_that_downloads_things).start()
threading.Thread(target = func_that_downloads_things).start()

#take the end time
thread_end_time = time.time()

#tell the world how long it took to start the threads and get to this point
print('took '+ str(round(thread_end_time - thread_start_time, 6)) + ' seconds to initiate all the downloads')

print("threading.active_count() is at " + str(threading.active_count()))

Пока этого кода нет:

import requests, threading, time

def func_that_downloads_things(url):
    def dl(url):
        request_method = 'GET'
        request_url = url
        r = requests.request(method=request_method, url=request_url, timeout=4)
        print(r.text + '... took ' + str(round(time.time() - thread_start_time, 4)) + " seconds to download... and threading.active_count() is at " + str(threading.active_count()))
    threading.Thread(target = dl(url)).start()

#take the start time
thread_start_time = time.time()

#download 4 websites
func_that_downloads_things('http://olympus.realpython.org/dice')
func_that_downloads_things('http://olympus.realpython.org/dice')
func_that_downloads_things('http://olympus.realpython.org/dice')
func_that_downloads_things('http://olympus.realpython.org/dice')

#take the end time
thread_end_time = time.time()

#tell the world how long it took to start the threads and get to this point
print('took '+ str(round(thread_end_time - thread_start_time, 6)) + ' seconds to initiate all the downloads')

print("threading.active_count() is at " + str(threading.active_count()))

Почему?

1 Ответ

3 голосов
/ 25 июня 2019

Заменить

threading.Thread(target = dl(url)).start()

на

threading.Thread(target = dl, args=(url,)).start()

Ваш код сначала запускается dl(url) до того, как поток даже был создан из-за записиэто всегда вызов функции (или конструктора).

Второй код передает только не вызванный объект функции объекту потока вместе с аргументом.Затем функция вызывается позже с заданным аргументом во вновь созданном потоке.

...