09-多线程和队列

一、一个列表中有100个url地址,每个地址请求一次,请设计程序一个程序,
使用4个线程去发送这 100个请求(假设请求每个地址需要0.5秒,请求的代码用time.sleep(0.5)代替),
计算一共需要多长时间计算出总耗时!(注意点:是4个线程一共发送100个请求,不是每个线程发送100个,不要理解错了

import time
import requests
import threading


class ThreadRequests(threading.Thread):
    def run(self):
        for i in range(25):
            res = requests.get('https://www.baidu.com')
            print('Thread-{}---第{}次请求'.format(self.name, i + 1))


def main():
    s = time.time()
    # 创建4个线程对象
    th = [ThreadRequests() for j in range(4)]
    # 遍历线程对象
    for i in th:
        i.start()
    for j in th:
        j.join()
    time.sleep(0.5)
    e = time.time()
    print('总耗时:{}'.format(e))
    print('平均时间:{}'.format((e - s) / 1000))


main()

二、生产者消费者模式实现
1、用一个队列来存储数据
2、创建一个专门生产数据的任务函数,循环生产5次数据,每轮循环,往队列中添加20条数据,每循环一轮暂停1秒
3、创建一个专门处理数据的任务函数 循环获取队列中的数据处理,每秒处理4条数据。
4、创建一个线程生产数据 ,3个线程处理数据
5、统计数据生产并获取完 程序运行的总时长

from queue import Queue
import threading
import time

q = Queue()


def work():
    for i in range(5):
        for j in range(20):
            q.put(f'生产数据{j}')
        time.sleep(1)


def handle():
    while True:
        for i in range(4):
            try:
                data = q.get(timeout=1)
            except:
                return
            else:
                print('获取数据:', data)
                q.task_done()
        time.sleep(1)


if __name__ == '__main__':
    st = time.time()
    t = threading.Thread(target=work)
    t.start()

    thread_list = []
    for i in range(3):
        t1 = threading.Thread(target=handle)
        t1.start()
        thread_list.append(t1)

    # todo 等待数据生产完成
    t.join()
    for t1 in thread_list:
        t1.join()
    # todo 等待队列中的数据处理完成
    q.join()

    print('主线程执行完毕')
    st1 = time.time()
    print('程序执行时间:', st1 - st)

Queue 理解

① Queue.qsize() 返回队列的大小
② Queue.empty() 如果队列为空,则返回True,反之则返回False
③ Queue.full() 如果队列满了,则返回True,反之则返回False
④ Queue.full 与 maxsize 大小对应
⑤ Queue.get([block[,timeout]])获取队列,timeout等待时间
⑥ Queue.get_nowait() 相当Queue.get (False)
⑦ Queue.put(item) 写入队列,timeout 等待时间
⑧ Queue.put_nowait(item) 相当Queue.put(item,False)
⑨ Queue.taskdone() 在完成一项工作之后,Queue.taskdone() 函数向任务已经完成的队列发送一个信号
⑩ Queue.join() 实际上意味着等到队列为空,再执行别的操作

天才有两种,一种是天生的,一种是像我这么努力的。

你可能感兴趣的:(工具,开发,python,java,开发语言)