多线程的执行顺序
守护线程
计算机科学中,守护线程(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 性能
如果想要对多线程运行结果进行排序,改怎么做 ?
多线程执行是没有顺序的,但是可以对任务进行编号,等任务执行完了之后再进行排序
"""