Python爬虫基础讲解(十七):threading模块的使用

Posted 松鼠爱吃饼干

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫基础讲解(十七):threading模块的使用相关的知识,希望对你有一定的参考价值。

Python爬虫、数据分析、网站开发等案例教程视频免费在线观看

https://space.bilibili.com/523606542

 

Python学习交流群:1039649593

 

threading模块的使用

python的thread模块是底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用。

1. threding模块创建线程对象

接上述案例,我们可以利用程序阻塞的时间让程序执行后面的任务,可以用多线程的方式去实现。对应的需要我们借助threading模块去实现:
如下所示

import time
import threading
def work():
"""只有函数对象才能佈田名线积"""
print(\'5.洗茶杯: 1min \' )
time.sleep(1)
print(\'6.放茶叶: 1min \' )
time.sleep(1)

start_time = time .time()
print( \'1.洗壶: 1min \' )
time.s1eep(1)
print( \'2.灌凉水:1min \' )
time.sleep(1)
print( \'3.烧水: 1min \' )
time.sleep(1)
print( \'4.等水烧开:3min \' )
work_thread = threading.Thread(target=work)

# 启动线程对象
work_thread.start()
time.sleep(1) # 5.洗茶杯: 1min
time.sleep(1) # 6.放茶叶: 1min
time.sleep(1)
print( \'7.泡茶:1min \' )
time.sleep(1)
print(\'总共花了: \',time.time() - start_time)

 

以上案例是一个单线程,需要特别注意的是threading模块操作线程所操作的必须是函数对象。通过threding模块可以把一个普通的函数对象转化为线程对象。

2. threding模块创建多线程

当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下,主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束。

import time
import threading

def upload():
print("开始上传文件...")
time.sleep(2)
print("完成上传文件...")

def down1oad():
print("开始下载文件...")
time.s1eep(2)
print("完成下载文件...")

if __name__ == \'__main__\':
upload_thread = threading.Thread(target=up1oad)
up1oad_thread .start()
up1oad_thread.join()
down1oad_thread = threading.Thread(target=down1oad,daemon=True)
down1oad_thread.start()
print(\'主线程结束\')

 

也就是说主线程在分配任务时会创建多个子线程,子线程的任务进度不会阻碍主线程的执行。但是主线程会等待子线程执行任务完之后才结束主线程。也就是说实际上主线程是先执行完任务的,如果你想在主线程执行完之后就结束整个线程的话,那么可以设置守护主线程。

3. 多线程的参数传递

多线程的参数传递用args接受位置参数,用kwargs接受关键字参数。如下所示:

import threading

def get(ur1,header=None):
    print(ur1)
    print(header)

for url in [ \'https : / /www.baidu.com\', \'https:/ /www. soso.com \' ,\' https: / /www . 360. com\']:
    # threading.Thread
get_thread = threading. Thread(target=get,args=(ur1, ), kwargs={ \' header \':{ \'user-agent \' : \' pythonrequests\'}})
    get_thread.start

 

4. 线程产生的资源竞争

首先我们来看一个案例:

import threading
import time
import random

def add1(n):
    for i in range(100) :
        time.sleep(random.randint(1,3))
        with open( \'he7lo.txt\', mode=\'a\', encoding=\'utf-8 \' ) as f:
            f.write(f\'in} he1lo wor1d !\'+ \'he7lo wor1d !\'*1024)
            f.write(\' \\n \')

if __name__ == \'___main__\' :
    for n in range(10) :
        t1 = threading. Thread(target=add1,args=(n,))
        t1.start()

 

以上是关于Python爬虫基础讲解(十七):threading模块的使用的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫:零基础入门URL讲解

Redis(十七)-SpringBoot集成Redis

Redis(十七)-SpringBoot集成Redis

python爬虫(十七) 电影天堂爬虫1

Python爬虫基础讲解(十八):线程池的使用

Redis(二十七)- Redis的主从复制说明