请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

无法按照预期退出

def get_detail_html(queue):
   # 爬取文章详情页
   while True:
       for i in range(5):
           url = queue.get()
           print("get detail html started") #该行缩近一个单元则能正常退出
       time.sleep(2)
       for i in range(5):
           queue.task_done()
       print("get detail html end")
def get_detail_url(queue):
   # 爬取文章列表页
   for i in range(20):
       queue.put("http://projectsedu.com/{id}".format(id=i))
# 1. 线程通信方式- 共享变量
if __name__ == "__main__":
   detail_url_queue = Queue(maxsize=1000)
   thread_detail_url = threading.Thread(target=get_detail_url, args=(detail_url_queue,))
   for i in range(10):
       html_thread = threading.Thread(target=get_detail_html, args=(detail_url_queue,))
       html_thread.setDaemon(True)
       html_thread.start()
   start_time = time.time()
   thread_detail_url.start()
   detail_url_queue.join()

   # 当主线程退出的时候, 子线程kill掉
   print("last time: {}".format(time.time() - start_time))

正在回答 回答被采纳积分+3

1回答

bobby 2018-08-08 11:34:03

如果启用t.setDaemon(True),这段代码的运行流程是:当主线程打印完最后一句话后,不管 son thread 是否运行完,程序立即结束,你现在的情况是什么呢?

0 回复 有任何疑惑可以回复我~
  • 提问者 慕无忌2744351 #1
    设了 detail_url_queue.join() 所以主线程无法退出(我猜测是task_done() 附近有问题),所以子进程也无法退出;
    回复 有任何疑惑可以回复我~ 2018-08-08 15:33:49
  • bobby 回复 提问者 慕无忌2744351 #2
    http://www.vuln.cn/8610 你可以看看这个
    回复 有任何疑惑可以回复我~ 2018-08-10 10:42:35
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信