由git checkout引发的python多线程思考

2019-11-03  本文已影响0人  wanncy

声明:并非标题党,确实是一件实际的案例,这里只是详细捋一下自己的分析过程

def worker():
    while True:
        item = q.get()
        if item is None:
            break
        do_work(item)
        q.task_done()

q = queue.Queue()
threads = []
for i in range(num_worker_threads):
    t = threading.Thread(target=worker)
    t.start()
    threads.append(t)

for item in source():
    q.put(item)

# block until all tasks are done
q.join()

# stop workers
for i in range(num_worker_threads):
    q.put(None)
for t in threads:
    t.join()

看到以上代码段的时候来源,特别是#stop workers这一段,确信:join()的作用只是起到barrier的作用,用于同步,并不能结束子线程的执行,在考虑这种多线程问题的时候,还要设置子线程退出机制,对于子线程的退出机制:

对于子线程退出的问题,我采用的做法,是通过判断queue为空,子线程退出,这适用于“快生产、慢消费”场景(不同生产消费场景思考)

  if self.news_detail_url_queue.empty():
     break

使用with statement虽然保证了子线程的退出和资源的正确释放,这也是导致整个执行过程被阻塞的根源。 也就是不能使parallel_do之间实现并发,要想并发,可以考虑去除with statement。

上一篇 下一篇

猜你喜欢

热点阅读