首页 > 编程语言 > 详细

python3 结束子线程

时间:2019-10-12 19:40:07      阅读:183      评论:0      收藏:0      [点我收藏+]

  最近公司内部网络经常出问题,奇慢无比,导致人脸检测程序在下载图片时经常卡住,为了不影响数据的核对, 决定在网络不佳图片下载超时后放弃下载,继续执行后续程序。

于是整理出解决思路如下:

  1、在线程中完成图片下载任务

  2、设置图片下载超时的时间

  3、当下载超时后线束下载线程, 执行后续任务

为了便于演示下载效果, 决定采集requests请求方法, 而不用urltrieve下载

 

一、先看看单线程如何下载图片的问题

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

# __author__:kzg import threading import time
from urllib.request import urlretrieve def callbackinfo(down, block, size): ‘‘‘ 回调函数: down:已经下载的数据块 block:数据块的大小 size:远程文件的大小 ‘‘‘ per = 100.0 * (down * block) / size if per > 100: per = 100 time.sleep(1) # sleep 1秒 print(%.2f%% % per)
# 图片下载函数 def downpic(url): urlretrieve(url,
test.jpg, callbackinfo) url = https://s1.tuchong.com/content-image/201909/98cac03c4a131754ce46d51faf597230.jpg # 执行线程 t = threading.Thread(target=downpic, args=(url,)) t.start() t.join(3) print("down OK") 结果: 0.00% 1.51% down OK 3.02% 4.52% 6.03%
……

  可以看到,执行过程

    1、将图片下载程序塞到线程中执行

    2、启动线程

    3、三秒后线程仍未执行完,放弃阻塞

    4、执行print

    5、线程继续执行, 直到完成

 

二、守护线程(deamon)

    守护线程结束, 其中的子线程也被迫结束

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# __author__:kzg

import threading
import time
from urllib.request import urlretrieve

def callbackinfo(down, block, size):
    ‘‘‘
    回调函数:
    down:已经下载的数据块
    block:数据块的大小
    size:远程文件的大小
    ‘‘‘
    per = 100.0 * (down * block) / size
    if per > 100:
        per = 100
    time.sleep(1)
    print(%.2f%% % per)

def downpic(url):
    urlretrieve(url, test.jpg, callbackinfo)

def mainFunc(funcname, args):
    ‘‘‘
    :param funcname: 函数名(图片下载函数)
    :param args: 参数(url地址)
    :return:
    ‘‘‘
    t = threading.Thread(target=funcname, args=(args,))
    t.start()  # 开始执行线程
    t.join(timeout=5)  # 5秒后线程仍未执行完则放弃阻塞, 继续执行后续代码


url = https://s1.tuchong.com/content-image/201909/98cac03c4a131754ce46d51faf597230.jpg

m = threading.Thread(target=mainFunc, args=(downpic, url))
m.setDaemon(True)
m.start()
m.join()


结果:
0.00%
1.51%
3.02%
4.52%

  可以看到执行结果:

    1、mainfunc函数被塞到m线程中

    2、m线程设置为守护线程

    3、启动守护线程

    4、mainfunc下的子线程 t在5秒后仍未执行完, 

        放弃阻塞,执行后续程序

        m.join被执行, 守护线程结束,子线程t 被迫结束(结果中只有图片只下载了4秒) 

        图片中止下载

 

    

 

python3 结束子线程

原文:https://www.cnblogs.com/kongzhagen/p/11663427.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!