Python 为什么这段代码同时使用setDaemon()和join()?

Python 为什么这段代码同时使用setDaemon()和join()?,python,multithreading,web-crawler,Python,Multithreading,Web Crawler,我正在学习线程爬虫。下面的代码是从列表PROXY\u站点获取代理url。方法,save_proxy,将请求提供代理URL的网站并将其插入MongoDB def use_thread(): cleanup() threads = [] for url in PROXY_SITES: t = threading.Thread(target=save_proxies, args=(url,)) t.setDaemon(True)

我正在学习线程爬虫。下面的代码是从列表
PROXY\u站点
获取代理url。方法,
save_proxy
,将请求提供代理URL的网站并将其插入MongoDB

def use_thread():
    cleanup()
    threads = []
    for url in PROXY_SITES:
        t = threading.Thread(target=save_proxies, args=(url,))
        t.setDaemon(True)
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

我不明白为什么同时使用
setDaemon()
join()
。如果代码有效,主线程将杀死子线程或等待处理子线程?

因为线程被设置为“守护进程”(好的,在这种模式下运行),而不等待它们完成
join()
脚本将快速处理其余线程,并且可能,在主线程退出时关闭“守护进程”线程时,在它们完成执行之前杀死它们。如果未将线程设置为“守护进程”,则不需要显式设置,但这取决于代码的其余部分(如果有)。如果其中一个线程挂起或引发异常,即使其他线程仍在运行,脚本也可以终止。这是必需的,因为默认情况下,当主线程终止时,由主线程创建和启动的任何线程如果仍在运行,都将阻止脚本退出,因为线程被设置为“守护进程”(好的,在这种模式下运行)不必等待它们完成
join()
,脚本将快速完成其余部分,并可能在它们完成执行之前杀死它们,因为当主线程退出时,“守护进程”线程将关闭。如果未将线程设置为“守护进程”,则不需要显式设置,但这取决于代码的其余部分(如果有)。如果其中一个线程挂起或引发异常,即使其他线程仍在运行,脚本也可以终止。这是必需的,因为默认情况下,由主线程创建和启动的任何线程都将阻止它退出,如果它们在主线程终止时仍在运行