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

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.

主站蜘蛛池模板: 沂水县| 襄樊市| 海伦市| 松潘县| 呼伦贝尔市| 澄城县| 上杭县| 阜城县| 蕉岭县| 凌云县| 栾川县| 阜阳市| 东乌珠穆沁旗| 宣武区| 湟中县| 张家界市| 东方市| 夏河县| 康马县| 石屏县| 嵊州市| 安徽省| 榆社县| 土默特左旗| 若尔盖县| 微博| 南宫市| 鄂尔多斯市| 新泰市| 宜州市| 乌兰县| 宁蒗| 连平县| 施甸县| 石首市| 襄垣县| 龙海市| 唐海县| 宁都县| 余干县| 扬州市|