如何进行多线程编程

#对于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)

扫描二维码关注公众号,回复: 2433283 查看本文章

  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)) 

注意:如果使用线程池还是使用第一种方案。

  

猜你喜欢

转载自www.cnblogs.com/wuheng-123/p/9383478.html
今日推荐