import concurrent
import subprocess
import time
def exec(cmd):
result = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, encoding='utf8')
result.stdout.read().splitlines()
cmds = ['python a', 'python b', 'python c']
if __name__ =='__main__':
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
future_to_url = {executor.submit(exec, cmd): cmd for cmd in cmds}
print(future_to_url)
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
data = future.result()
except Exception as exc:
print('%r generated an exception: %s' % (url, exc))
else:
print('%r page is %d bytes' % (url, len(data)))
start_time_1 = time.time()
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(exec, cmd) for cmd in cmds]
for future in concurrent.futures.as_completed(futures):
print(future.result())
print("Thread pool execution in " + str(time.time() - start_time_1), "seconds")
start_time_2 = time.time()
with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(exec, cmd) for cmd in cmds]
for future in concurrent.futures.as_completed(futures):
print(future.result())
print("Process pool execution in " + str(time.time() - start_time_2), "seconds")
future实例方法 (既上面代码中future可调用的方法)
cancelled() 如果调用已经被成功取消,返回 True。
running() 如果调用正在执行,无法被取消,则返回 True。
done() 如果调用成功被取消或者已经执行完毕,返回 True。
result(timeout=None) 返回调用的返回值。如果调用还没有完成,则最多等待 timeout 秒。如果 timeout 秒之后还没有完成,抛出 concurrent.futures.TimeoutError。timeout 可以为整数或者浮点数。如果不指定或者为 None,则不限制等待时间。如果 future 在完成之前被取消了,会抛出 CancelledError 异常。
如果调用抛出异常,这个方法会抛出同样的异常。
exception(timeout=None)
返回被调用抛出的异常。如果调用还没有执行完毕,则最多等待 timeout 秒。如果 timeout 秒之后还没有完成,抛出 concurrent.futures.TimeoutError。timeout 可以为整数或者浮点数。如果不指定或者为 None,则不限制等待时间。
如果 future 在完成之前被取消了,会抛出 CancelledError 异常。
如果调用完成并且没有抛出异常,返回 None。
add_done_callback(fn)
为 future 附加可调用对象 fn。当 future 运行完毕或者被取消时,它会被用作 fn 的唯一参数,并调用 fn。
可调用对象按照添加顺序依次调用,并且总是在添加时所处进程的一个线程内调用它。如果该可调用对象抛出了属于 Exception 子类的异常,它会被记录并忽略。如果它抛出了属于 BaseException 子类的异常,该行为未定义。
如果 future 已经完成或者已经取消,fn 会被立即调用