python 并发(多线程与线程池)

线程池

#!/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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值