#对于io操作来说,多线程比较好。
#1.通过threading实例化一个对象
import time
def get_detail_html(url):
print('get detail html')
time.sleep(2)
print('get detail html end')
def get_detail_url(url):
print("get detail url started")
time.sleep(2)
print('get detail url end')
if __name__ == "__main__":
args传递参数进去给函数
thread1 = threading.Thread(target=get_detail_html,args=("",))
thread2 = threading.Thread(target=get_detail_html,args=("",))
start_time = time.time()
调用start()方法开启线程
thread1.start()
thread2.start()
#需求2:子线程运行完,才运行主线程
开启join()线程运行完,才能运行主线程
thread1.join()
thread2.join()
print(''last time:{}''.format(time.time-start_time))
从上面的代码执行中,我们可以看出主线程运行完,程序并没有退出,进程没有回收资源,而是等其他线程运行完,才回收。
现在我有个需求,就是主线程运行完,子线程kill掉,直接退出
(只要在调用start()方法开启线程之前,设置成守护线程就行了,具体该怎么操作,
#开启守护线程(多线程中的守护线程是等所有的线程运行完毕才kill掉)
thread1.setDaemon(True),
thread2.setDaemon(True)
)
----------------------守护线程和join()方法比较重要----------------------------------------
对于一些简单的可以用上面的方法,对于一些比较复杂的境况,要下面的方法
class GetDetailHtml(threading.Thread):
def __init__(self,name):
super().__init__(name=name)
#必须要继承threading.Thread类实现run()方法
def run(self):
print('get detail html')
time.sleep(2)
print('get detail html end')
class GetDetailUrl(threading.Thread):
def __init__(self,name):
super().__init__(name=name)
def run(self):
print('get detail url')
time.sleep(2)
print('get detail url end')
if __name__ == "__main__":
thread1 = GetDetailHtml("get_detail_html")
thread2 = GetDetailUrl("get_detail_url")
start_time = time.time()
调用start()方法开启线程
thread1.start()
thread2.start()
#需求2:子线程运行完,才运行主线程
开启join()线程运行完,才能运行主线程
thread1.join()
thread2.join()
print(''last time:{}''.format(time.time-start_time))
注意:如果使用线程池还是使用第一种方案。