线程池
#!/usr/bin/env python
# encoding: utf-8
import requests
from concurrent.futures import ThreadPoolExecutor
class ReqQueue(object):
def fetch_response(self, url):
"""
获取链接内容
"""
headers = {}
response = requests.request('GET', url, headers=headers)
if response.status_code != 200:
logging.error("获取失败")
return False
result = ujson.loads(response.text)
return result
def handle(self):
startTime = time.time()
with ThreadPoolExecutor(max_workers=10) as pool:
# 使用线程执行map计算
# 后面元组有3个元素,因此程序启动3条线程来执行action函数
data_list = [{"id": 1}, {"id": 2}, {"id": 3}]
results = pool.map(self.fetch_response, data_list)
print('--------------')
for r in results:
print('print(r)')
print(r)
endTime = time.time()
print('用时:', endTime-startTime)
线程
1. 使用线程
import threading
import requests
import time
def getRequest(account, today):
url = 'https://www.baidu.com'
print('开始执行线程, {}'.format(threading.current_thread()))
response = requests.request('GET', url, headers=self.headers)
time.sleep(2)
return response
if __name__ == "__main__":
startTime = time.time()
today = getdatetime("%Y-%m-%d", timezone=self.timezone)
fb_type = 1
print('开始执行数据...')
account_list = [{"id": 1, "today": "2023-01-01"}, {"id": 2, "today": "2023-01-02"}, {"id": 4, "today": "2023-01-05"}]
t = []
print('创建线程')
for account in account_list:
# print(account)
# 创建线程
ts = threading.Thread(target=getRequest, args=(account, today))
t.append(ts)
print('启动线程')
for ts in t:
# 启动线程
ts.start()
print("thread finished , cost %s s" % (time.time() - startTime))
print('结束执行数据...')
打印结果:(执行时间 0.002013683319091797 s)
开始执行数据...
创建线程
启动线程
开始执行线程, <Thread(Thread-6 (__get_ad_campaigns_insights2), started 10764)>
开始执行线程, <Thread(Thread-7 (__get_ad_campaigns_insights2), started 4400)>
开始执行线程, <Thread(Thread-8 (__get_ad_campaigns_insights2), started 8500)>thread finished , cost 0.002013683319091797 s
结束执行数据...
2. 但如果在ts.start() 后边加上ts.join()
程序就会等待一个线程结束再执行下一个线程,(执行时间 6.57s)
3. 在创建线程的同时启动
打印结果:(执行时间 2.2789 s)