使用线程池写入文件时遇到的问题

##需要的效果是 调用一次线程写一个文件,现在的结果是全部线程结束后一次性写完所有文件,没明白是为什么

from pyquery import PyQuery as pq
import time
import random
from concurrent.futures import ThreadPoolExecutor

def paca():
    threadPool = ThreadPoolExecutor(max_workers=5, thread_name_prefix="test2_")
    for i in range(1, 20):
        com=str(i)
        threadPool.submit(pacc, com)

def pacc(com):
    time.sleep(random.randint(1,10))
    with open("./statics/" + com + ".html", 'w', encoding="utf-8") as f:
        print("写文件" + com,("title"))
        f.write(('html'))
讨论数量: 4
Jason990420

现在的结果是需要等全部线程结束后一次性写完所有文件

你怎么判断全部线程结束了 ? 我怀疑 … 问题本身就是错的 …

  • 20 个Futurespaca() 中设置完
  • 只有未完成的前五个才会执行, 而且
  • 每个线程中都要等待time.sleep(random.randint(1,10)) 秒才写文件, 所以
  • 感觉所有的文件都在最后一个一个写入
  • 事实上是每个线程在写入文件后才算结束.
3年前 评论
panta (楼主) 3年前
pardon110

执行一次写一次可考虑生成器,但这样失去了线程池的意义

def paca():
   ...
   threadPool.submit(pacc, com)
   yield

效果

t = paca()
# next一下,执行一次写一次
next(t)  # 写文件2 title
next(t)  # 写文件1 title
next(t)  # 写文件3 title
3年前 评论
Jason990420

你可以检查 future.done()True, 代表已执行完, 再执行下一个.

future = threadPool.submit(pacc, com)
3年前 评论

你设置了sleep,代码会存在等待执行的状态。
而且我也运行了你的代码,在我这边是分别写入的,并不是最终一下子写入的。而且输出的信息也是一点一点输出的。。。

还有就是最好使用with ThreadPoolExecutor as xxx的方式。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!