python多线程

多线程: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()

将线程池状态置为SHUTDOWN,并不会立即停止:

  • 停止接收外部submit的任务
  • 内部正在跑的任务和队列里等待的任务,会执行完
  • 等到第二步完成后,才真正停止

进程池

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()

你可能感兴趣的:(python,python)