多线程:https://mp.weixin.qq.com/s/Hgp-x-T3ss4IiVk2_4VUrA
as_completed()方法用于将线程池返回的future对象按照线程完成的顺序排列,不加也可以,不加则返回的顺序为按线程创建顺序返回。
除此之外,还可以使用with语句来配合线程池来使用:
from concurrent.futures import ThreadPoolExecutor, as_completed
def func(i):
print("executed func")
return i
with ThreadPoolExecutor(max_workers=5, thread_name_prefix="test_") as thread_pool_executor:
all_task = [thread_pool_executor.submit(func, i) for i in range(10)]
for future in as_completed(all_task):
res = future.result()
print("res", str(res))
with语句将自动关闭线程池,也就是自动执行shutdown方法。
将线程池状态置为SHUTDOWN,并不会立即停止:
apply()和apply_async()方法时,第2个参数只能传入元祖,传入列表进程不会被执行
def fun_01(i):
time.sleep(2)
print(f'start_time:{time.ctime()}')
return i+100
def fun_02(arg):
print(f'end_time {arg} {time.ctime()}')
if __name__=='__main__':
pool = multiprocessing.Pool(processes=3)
for i in range(4):
pool.apply_async(func=fun_01,args=(i,),callback=fun_02)
pool.close() #不先关闭的话,会报错.ValueError: Pool is still running
pool.join() #不加这个的话,主进程执行完,不会执行子进程
print(f'done')
from multiprocessing import Process,Pipe
def f(conn):
conn.send([42,None,'hello'])
conn.close()
if __name__=='__main__':
## 生成管道。 生成时会产生两个返回对象,这两个对象相当于两端的电话,通过管道线路连接。
## 两个对象分别交给两个变量
parent_conn,child_conn = Pipe()
p = Process(target=f,args=(child_conn,))
p.start()
print(parent_conn.recv())
# p.join()
# p.close()