官术网_书友最值得收藏!

Refactoring request logic

The current version of our ping test application works as intended, but we can improve its readability by refactoring the logic where we make web requests into a thread class. Consider the Chapter05/example4.py file, specifically the MyThread class:

# Chapter05/example4.py

import threading
import requests

class MyThread(threading.Thread):
def __init__(self, url):
threading.Thread.__init__(self)
self.url = url
self.result = None

def run(self):
res = requests.get(self.url)
self.result = f'{self.url}: {res.text}'

In this example, MyThread inherits from the threading.Thread class and contains two additional attributes: url and result. The url attribute holds the URL that the thread instance should process, and the response returned from the web server to that thread will be written to the result attribute (in the run() function).

Outside of this class, we now can simply loop through the URL list, and create and manage the threads accordingly while not having to worry about the request logic in the main program:

urls = [
'http://httpstat.us/200',
'http://httpstat.us/400',
'http://httpstat.us/404',
'http://httpstat.us/408',
'http://httpstat.us/500',
'http://httpstat.us/524'
]

start = time.time()

threads = [MyThread(url) for url in urls]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
for thread in threads:
print(thread.result)

print(f'Took {time.time() - start : .2f} seconds')

print('Done.')

Note that we are now storing the responses in the result attribute of the MyThread class, instead of directly printing them out as in the old ping() function from the previous examples. This means that, after making sure that all threads have finished, we will need to loop through the threads one more time and print out those responses.

Refactoring the request logic should not greatly affect the performance of our current program; we are keeping track of the execution speed to see if this is actually the case. Execute the program and you will obtain the output similar to the following:

http://httpstat.us/200: 200 OK
http://httpstat.us/400: 400 Bad Request
http://httpstat.us/404: 404 Not Found
http://httpstat.us/408: 408 Request Timeout
http://httpstat.us/500: 500 Internal Server Error
http://httpstat.us/524: 524 A timeout occurred
Took 0.14 seconds
Done.

Just as we expected, we are still achieving a significant speedup from the sequential version of the program with this refactored request logic. Again, our main program is now more readable, and further adjustments of the request logic (as we will see in the next section) can simply be directed to the MyThread class, without affecting the rest of the program.

主站蜘蛛池模板: 佛冈县| 达尔| 孟州市| 福州市| 峡江县| 锡林郭勒盟| 怀集县| 建瓯市| 涿鹿县| 措美县| 万源市| 如东县| 宣汉县| 深泽县| 白银市| 佛冈县| 巴马| 军事| 泰安市| 玉门市| 唐河县| 榆林市| 明星| 榆树市| 乌拉特中旗| 济南市| 彭州市| 大兴区| 吉林省| 遂溪县| 都匀市| 曲麻莱县| 洞口县| 聂拉木县| 丹寨县| 湘阴县| 永泰县| 迁安市| 娄底市| 九江县| 霍邱县|