Skip to content

多线程的执行顺序

守护线程

计算机科学中,守护线程(daemon) 是在后台运行的过程。

Python threading 具有更具体的含义 daemon。程序退出时 daemon 线程将立即关闭。考虑这些定义的一种方法是将 daemon 线程设置为在后台运行的线程,而不必担心将其关闭。

当我们使用 setDaemon(True) 方法,设置子线程为守护线程时,主线程一旦执行结束,则全部线程全部被终止执行,可能出现的情况就是,子线程的任务还没有完全执行结束,就被迫停止。

py
import threading
import time


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


def download():
    print("开始下载文件...")
    time.sleep(1)
    print("完成下载文件...")


if __name__ == '__main__':
    # 设置为守护线程 当主线程运行完时 子线程被 kill 掉
    # 设置守护主线程方式 1,daemon=True 守护主线程
    thread1 = threading.Thread(target=upload, daemon=True)
    thread2 = threading.Thread(target=download)
    # thread1.daemon = True
    # 设置守护主线程方式 2
    thread2.daemon = True
    thread1.start()
    thread2.start()

    # 默认情况下 主线程退出与时 子线程不会被 kill 掉
    print("主线程结束")

多线程执行没有顺序

python
import threading

import parsel
import requests

urls = [
    'https://maoyan.com/board/4?offset=0',
    'https://maoyan.com/board/4?offset=10',
    'https://maoyan.com/board/4?offset=20',
    'https://maoyan.com/board/4?offset=30',
    'https://maoyan.com/board/4?offset=40',
    'https://maoyan.com/board/4?offset=50',
    'https://maoyan.com/board/4?offset=60',
    'https://maoyan.com/board/4?offset=70',
    'https://maoyan.com/board/4?offset=80',
    'https://maoyan.com/board/4?offset=90'
]

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36'
}


def download(url):
    response = requests.get(url, headers=headers)
    sel = parsel.Selector(response.text)
    title = sel.css('.name a::text').get()
    print(url, title)


if __name__ == '__main__':
    for url in urls:
        thread1 = threading.Thread(target=download, args=(url,))
        thread1.start()

"""

为什么多线程的结果没有顺序 ? 多线程任务运行的时间是不固定的

顺序执行: 一个一个运行
多线程:   多线程的作用是讲普通对象变成多线程对象

为什么多线运行的时候顺序会乱 ?
    多线程任务运行的时间是不固定的
        + 网络波动
        + 剩余内存空间
        + cpu 性能

如果想要对多线程运行结果进行排序,改怎么做 ?
多线程执行是没有顺序的,但是可以对任务进行编号,等任务执行完了之后再进行排序
"""