寒假python培训(3)

Python 多线程

多线程类似于同时执行多个不同程序,多线程运行有如下优点:

  • 使用线程可以把占据长时间的程序中的任务放到后台去处理。
  • 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
  • 程序的运行速度可能加快
  • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

Python中使用线程有两种方式:函数或者用类来包装线程对象。

函数式:调用thread模块中的start_new_thread()函数来产生新线程。语法如下:

thread.start_new_thread ( function, args[, kwargs] )

参数说明:

  • function - 线程函数。
  • args - 传递给线程函数的参数,他必须是个tuple类型。
  • kwargs - 可选参数。

因为CPU在执行程序时每个时间刻度上只会存在一个线程,因此多线程实际上提高了进程的使用率从而提高了CPU的使用率

实现多线程的库有很多,这里用concurrent.futures中的ThreadPoolExecutor来演示。介绍ThreadPoolExecutor库是因为它相比其他库代码更简洁

为了方便说明问题,下面代码中如果是新增加的部分,代码行前会加上 > 符号便于观察说明问题,实际运行需要去掉

import requests
> from concurrent.futures import ThreadPoolExecutor

def parse_1():
    url = 'https://www.baidu.com'
    # 建立线程池
    > pool = ThreadPoolExecutor(6)
    for i in range(300):
        > pool.submit(parse_2, url)
    > pool.shutdown(wait=True)

def parse_2(url):
    response = requests.get(url)
    print(response.status_code)

if __name__ == '__main__':
    parse_1()

跟同步相对的就是异步。异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式,也就是说多线程是异步处理异步就意味着不知道处理结果,有时候我们需要了解处理结果,就可以采用回调

Python实现多线程有一个无数人诟病的GIL(全局解释器锁),但多线程对于爬取网页这种多数属于IO密集型的任务依旧很合适。

import time
import threading


class ThreadFirst(threading.Thread):
    def run(self):
        while True:
            localtime = time.asctime(time.localtime(time.time()))
            print(localtime)
            time.sleep(1)


class ThreadSecond(threading.Thread):
    def __init__(self, name):
        super(ThreadSecond, self).__init__()
        self.name = name

    def run(self):
        for i in range(4):
            print(self.name)
            time.sleep(2)


if __name__ == '__main__':
    trFirst = ThreadFirst()
    trSecond = ThreadSecond("张三")
    trSecond.start()
    trFirst.start()

实例:在一个线程中,每秒循环输出当前的年月日时分秒;与此同时,在另一个线程中,实现张三的姓名每2秒打印输出4次结束。注意:都需要使用类和继承实现功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值