• Python的threading和multiprocessing


    Python的threading

    基础用法, 通过 threading.Thread() 创建线程, 然后 start() 和 join()

    import time
    import threading
    
    def do_something(seconds):
    	print('Sleeping...')
    	time.sleep(seconds)
    	print('Done')
    
    start = time.perf_counter()
    threads = []
    
    for _ in range(10):
    	t = threading.Thread(target = do_something, args=[1])
    	t.start()
    	threads.append(t)
    
    for t in threads:
    	t.join()
    
    finish = time.perf_counter()
    print('Total: {}'.format(round(finish - start, 2)))
    

    使用线程池. 使用as_completed, 可以阻塞并按完成顺序输出结果, 而直接用executor.map()会将结果收集完成后一起返回.

    import time
    import threading
    from concurrent import futures
    
    def do_something(seconds):
    	print('Sleeping...')
    	time.sleep(seconds)
    	return 'Done ' + str(seconds)
    
    start = time.perf_counter()
    with futures.ThreadPoolExecutor(max_workers=3) as executor:
    	secs = [3, 2.5, 2, 2.2, 0.5]
    	results = [executor.submit(do_something, sec) for sec in secs]
    	for f in futures.as_completed(results):
    		print(f.result())
    
    # 注意区别
    with futures.ThreadPoolExecutor() as executor:
    	secs = [3, 2.5, 2, 2.2, 0.5]
    	# 下面这行实际是阻塞的
    	results = executor.map(do_something, secs)
    	for result in results:
    		print(result)
    
    finish = time.perf_counter()
    print('Total: {}'.format(round(finish - start, 2)))
    

    .

    Python的multiprocessing

    .在使用multiprocessing时, 子进程里的print()是会滞后打印的.

    import time
    import multiprocessing
    import logging
    
    def do_something(seconds):
    	print('Sleeping...', seconds)
    	time.sleep(seconds)
    	return 'Done ' + str(seconds)
    
    if __name__ == '__main__':
    	multiprocessing.log_to_stderr()
    	logger = multiprocessing.get_logger()
    	logger.setLevel(logging.INFO)
    	start = time.perf_counter()
    	secs = [3.1, 3.5, 3.1, 3.2, 3.5, 3.3]
    	processes = []
    	for sec in secs:
    		p = multiprocessing.Process(target=do_something, args=(sec,))
    		p.start()
    		processes.append(p)
    
    	for p in processes:
    		p.join()
    
    	finish = time.perf_counter()
    	print('Total: {}'.format(round(finish - start, 2)))
    	print()
    
    	pool = multiprocessing.Pool(processes=3)
    	print(pool.map(do_something, secs))
    	finish = time.perf_counter()
    	print('Total: {}'.format(round(finish - start, 2)))
    

    .

  • 相关阅读:
    错误: 找不到或无法加载主类/java BB.class 中文乱码
    如何新建git仓库并连接以及git branch相关命令
    String、StringBuffer与StringBuilder区别
    HTML选择器
    java中的system.out.println()和JSP中out.println()区别
    校园双选会,你都懂么
    android visible invisible和gone的区别
    Android 显示意图和隐式意图的区别
    android doGet和doPost
    Android 监听SMS短信
  • 原文地址:https://www.cnblogs.com/milton/p/11733851.html
Copyright © 2020-2023  润新知