Python并发编程-concurrent包
Python并发编程-concurrent包
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.concurrent.futures包概述
3.2版本引入的模块。 异步并行任务编程模块,提供一个高级的异步可执行的便利接口。 提供了2个池执行器:
ThreadPoolExecutor 异步调用的线程池的Executor
ProcessPoolExecutor 异步调用的进程池的Executor
二.ThreadPoolExecutor对象
1>.首先需要定义一个池的执行器对象,Executor类子类对象。
ThreadPoolExecutor(max_workers=1)
池中至多创建max_workers个线程的池来同时异步执行,返回Executor实例
submit(fn, *args, **kwargs)
提交执行的函数及其参数,返回Future类的实例
shutdown(wait=True)
清理池
2>.Future类
done()
如果调用被成功的取消或者执行完成,返回True
cancelled()
如果调用被成功的取消,返回True
running()
如果正在运行且不能被取消,返回True
cancel()
尝试取消调用。如果已经执行且不能取消返回False,否则返回True
result(timeout=None)
取返回的结果,timeout为None,一直等待返回;timeout设置到期,抛出"concurrent.futures.TimeoutError"异常
exception(timeout=None)
取返回的异常,timeout为None,一直等待返回;timeout设置到期,抛出"concurrent.futures.TimeoutError"异常
3>.ThreadPoolExecutor案例实战
#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import threading
from concurrent import futures
import logging
import time # 输出格式定义
FORMAT = '%(asctime)-15s\t [%(processName)s:%(threadName)s, %(process)d:%(thread)8d] %(message)s'
logging.basicConfig(level=logging.INFO, format=FORMAT) def worker(n):
logging.info('begin to work-{}'.format(n))
time.sleep(5)
logging.info('finished {}'.format(n)) """
线程池并不着急创建线程,用的时候创建,创建后不清除,复用
线程池一旦创建了线程,就不需要频繁清除
"""
executer = futures.ThreadPoolExecutor(max_workers=3) #创建线程池,池容量为3 fs = []
for i in range(3):
future = executer.submit(worker, i)
fs.append(future) for i in range(3, 6):
future = executer.submit(worker, i)
fs.append(future) while True:
time.sleep(2)
logging.info(threading.enumerate()) flag = True
for f in fs: # 判断是否还有未完成的任务
logging.info(f.done())
flag = flag and f.done()
# if not flag: # 注释了这个if,输出的日志看的清楚些
# break
print("-" * 30) if flag:
executer.shutdown()
logging.info(threading.enumerate())
break
2019-12-04 19:11:33,108 [MainProcess:ThreadPoolExecutor-0_0, 16684:123145346408448] begin to work-0
2019-12-04 19:11:33,108 [MainProcess:ThreadPoolExecutor-0_1, 16684:123145351663616] begin to work-1
2019-12-04 19:11:33,109 [MainProcess:ThreadPoolExecutor-0_2, 16684:123145356918784] begin to work-2
------------------------------
2019-12-04 19:11:35,113 [MainProcess:MainThread, 16684:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(ThreadPoolExecutor-0_0, started daemon 123145346408448)>, <Thread(ThreadPoolExecutor-0_1, started daemon 123145351663616)>, <Thread(ThreadPoolExecutor-0_2, started daemon 123145356918784)>]
2019-12-04 19:11:35,113 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:35,113 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:35,113 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:35,113 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:35,113 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:35,113 [MainProcess:MainThread, 16684:140736847635392] False
------------------------------
2019-12-04 19:11:37,114 [MainProcess:MainThread, 16684:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(ThreadPoolExecutor-0_0, started daemon 123145346408448)>, <Thread(ThreadPoolExecutor-0_1, started daemon 123145351663616)>, <Thread(ThreadPoolExecutor-0_2, started daemon 123145356918784)>]
2019-12-04 19:11:37,114 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:37,114 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:37,114 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:37,114 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:37,114 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:37,114 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:38,111 [MainProcess:ThreadPoolExecutor-0_0, 16684:123145346408448] finished 0
2019-12-04 19:11:38,111 [MainProcess:ThreadPoolExecutor-0_0, 16684:123145346408448] begin to work-3
2019-12-04 19:11:38,111 [MainProcess:ThreadPoolExecutor-0_1, 16684:123145351663616] finished 1
2019-12-04 19:11:38,112 [MainProcess:ThreadPoolExecutor-0_1, 16684:123145351663616] begin to work-4
2019-12-04 19:11:38,112 [MainProcess:ThreadPoolExecutor-0_2, 16684:123145356918784] finished 2
2019-12-04 19:11:38,112 [MainProcess:ThreadPoolExecutor-0_2, 16684:123145356918784] begin to work-5
------------------------------
2019-12-04 19:11:39,115 [MainProcess:MainThread, 16684:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(ThreadPoolExecutor-0_0, started daemon 123145346408448)>, <Thread(ThreadPoolExecutor-0_1, started daemon 123145351663616)>, <Thread(ThreadPoolExecutor-0_2, started daemon 123145356918784)>]
2019-12-04 19:11:39,115 [MainProcess:MainThread, 16684:140736847635392] True
2019-12-04 19:11:39,115 [MainProcess:MainThread, 16684:140736847635392] True
2019-12-04 19:11:39,115 [MainProcess:MainThread, 16684:140736847635392] True
2019-12-04 19:11:39,115 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:39,116 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:39,116 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:41,120 [MainProcess:MainThread, 16684:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(ThreadPoolExecutor-0_0, started daemon 123145346408448)>, <Thread(ThreadPoolExecutor-0_1, started daemon 123145351663616)>, <Thread(ThreadPoolExecutor-0_2, started daemon 123145356918784)>]
2019-12-04 19:11:41,120 [MainProcess:MainThread, 16684:140736847635392] True
------------------------------
2019-12-04 19:11:41,120 [MainProcess:MainThread, 16684:140736847635392] True
2019-12-04 19:11:41,120 [MainProcess:MainThread, 16684:140736847635392] True
2019-12-04 19:11:41,120 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:41,120 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:41,120 [MainProcess:MainThread, 16684:140736847635392] False
2019-12-04 19:11:43,116 [MainProcess:ThreadPoolExecutor-0_2, 16684:123145356918784] finished 5
2019-12-04 19:11:43,116 [MainProcess:ThreadPoolExecutor-0_0, 16684:123145346408448] finished 3
2019-12-04 19:11:43,116 [MainProcess:ThreadPoolExecutor-0_1, 16684:123145351663616] finished 4
2019-12-04 19:11:43,122 [MainProcess:MainThread, 16684:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(ThreadPoolExecutor-0_0, started daemon 123145346408448)>, <Thread(ThreadPoolExecutor-0_1, started daemon 123145351663616)>, <Thread(ThreadPoolExecutor-0_2, started daemon 123145356918784)>]
2019-12-04 19:11:43,122 [MainProcess:MainThread, 16684:140736847635392] True
2019-12-04 19:11:43,122 [MainProcess:MainThread, 16684:140736847635392] True
2019-12-04 19:11:43,122 [MainProcess:MainThread, 16684:140736847635392] True
2019-12-04 19:11:43,122 [MainProcess:MainThread, 16684:140736847635392] True
2019-12-04 19:11:43,122 [MainProcess:MainThread, 16684:140736847635392] True
2019-12-04 19:11:43,122 [MainProcess:MainThread, 16684:140736847635392] True
2019-12-04 19:11:43,123 [MainProcess:MainThread, 16684:140736847635392] [<_MainThread(MainThread, started 140736847635392)>]
------------------------------
以上代码执行结果戳这里
三.ProcessPoolExecutor对象
#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import threading
from concurrent import futures
import logging
import time
# 输出格式定义
FORMAT = '%(asctime)-15s\t [%(processName)s:%(threadName)s, %(process)d:%(thread)8d] %(message)s'
logging.basicConfig(level=logging.INFO, format=FORMAT) def worker(n):
logging.info('begin to work-{}'.format(n))
time.sleep(5)
logging.info('finished {}'.format(n)) if __name__ == '__main__':
"""
方法一样。就是使用多进程完成。
"""
executer = futures.ProcessPoolExecutor(max_workers=3) # 创建进程池,池容量为3 fs = []
for i in range(3):
future = executer.submit(worker, i)
fs.append(future) for i in range(3, 6):
future = executer.submit(worker, i)
fs.append(future) while True:
time.sleep(2)
logging.info(threading.enumerate()) flag = True
for f in fs: # 判断是否还有未完成的任务
logging.info(f.done())
flag = flag and f.done()
#if not flag: # 注释了这个if,输出的日志看的清楚些
# break
print('-' * 30) if flag:
executer.shutdown() # 清理池。除非不用了,否则不用频繁清理池
logging.info(threading.enumerate()) # 多进程时看主线程已没有必要了
break
2019-12-04 19:17:23,219 [Process-1:MainThread, 16714:140736847635392] begin to work-0
2019-12-04 19:17:23,219 [Process-2:MainThread, 16715:140736847635392] begin to work-1
2019-12-04 19:17:23,219 [Process-3:MainThread, 16716:140736847635392] begin to work-2
------------------------------
2019-12-04 19:17:25,222 [MainProcess:MainThread, 16713:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(Thread-1, started daemon 123145351159808)>, <Thread(QueueFeederThread, started daemon 123145356414976)>]
2019-12-04 19:17:25,223 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:25,223 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:25,223 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:25,223 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:25,223 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:25,223 [MainProcess:MainThread, 16713:140736847635392] False
------------------------------
2019-12-04 19:17:27,227 [MainProcess:MainThread, 16713:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(Thread-1, started daemon 123145351159808)>, <Thread(QueueFeederThread, started daemon 123145356414976)>]
2019-12-04 19:17:27,227 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:27,227 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:27,227 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:27,227 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:27,227 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:27,227 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:28,220 [Process-2:MainThread, 16715:140736847635392] finished 1
2019-12-04 19:17:28,220 [Process-1:MainThread, 16714:140736847635392] finished 0
2019-12-04 19:17:28,221 [Process-3:MainThread, 16716:140736847635392] finished 2
2019-12-04 19:17:28,221 [Process-2:MainThread, 16715:140736847635392] begin to work-3
2019-12-04 19:17:28,222 [Process-1:MainThread, 16714:140736847635392] begin to work-4
2019-12-04 19:17:28,222 [Process-3:MainThread, 16716:140736847635392] begin to work-5
2019-12-04 19:17:29,232 [MainProcess:MainThread, 16713:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(Thread-1, started daemon 123145351159808)>, <Thread(QueueFeederThread, started daemon 123145356414976)>]
2019-12-04 19:17:29,233 [MainProcess:MainThread, 16713:140736847635392] True
2019-12-04 19:17:29,233 [MainProcess:MainThread, 16713:140736847635392] True
2019-12-04 19:17:29,233 [MainProcess:MainThread, 16713:140736847635392] True
2019-12-04 19:17:29,233 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:29,233 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:29,233 [MainProcess:MainThread, 16713:140736847635392] False
------------------------------
2019-12-04 19:17:31,237 [MainProcess:MainThread, 16713:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(Thread-1, started daemon 123145351159808)>, <Thread(QueueFeederThread, started daemon 123145356414976)>]
2019-12-04 19:17:31,238 [MainProcess:MainThread, 16713:140736847635392] True
2019-12-04 19:17:31,238 [MainProcess:MainThread, 16713:140736847635392] True
2019-12-04 19:17:31,238 [MainProcess:MainThread, 16713:140736847635392] True
2019-12-04 19:17:31,238 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:31,238 [MainProcess:MainThread, 16713:140736847635392] False
2019-12-04 19:17:31,238 [MainProcess:MainThread, 16713:140736847635392] False
------------------------------
2019-12-04 19:17:33,223 [Process-2:MainThread, 16715:140736847635392] finished 3
2019-12-04 19:17:33,223 [Process-1:MainThread, 16714:140736847635392] finished 4
2019-12-04 19:17:33,224 [Process-3:MainThread, 16716:140736847635392] finished 5
------------------------------
2019-12-04 19:17:33,240 [MainProcess:MainThread, 16713:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(Thread-1, started daemon 123145351159808)>, <Thread(QueueFeederThread, started daemon 123145356414976)>]
2019-12-04 19:17:33,240 [MainProcess:MainThread, 16713:140736847635392] True
2019-12-04 19:17:33,240 [MainProcess:MainThread, 16713:140736847635392] True
2019-12-04 19:17:33,240 [MainProcess:MainThread, 16713:140736847635392] True
2019-12-04 19:17:33,240 [MainProcess:MainThread, 16713:140736847635392] True
2019-12-04 19:17:33,241 [MainProcess:MainThread, 16713:140736847635392] True
2019-12-04 19:17:33,241 [MainProcess:MainThread, 16713:140736847635392] True
2019-12-04 19:17:33,245 [MainProcess:MainThread, 16713:140736847635392] [<_MainThread(MainThread, started 140736847635392)>]
以上代码执行结果戳这里
四.支持上下文管理
#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie """
concurrent.futures.ProcessPoolExecutor继承自concurrent.futures._base.Executor,而父类有 __enter__ 、__exit__方法,支持上下文管理。可以使用with语句。 __exit__方法本质还是调用的shutdown(wait=True),就是一直阻塞到所有运行的任务完成 使用方法
with ThreadPoolExecutor(max_workers=1) as executor:
future = executor.submit(pow, 323, 1235)
print(future.result())
""" import threading
from concurrent import futures
import logging
import time # 输出格式定义
FORMAT = '%(asctime)-15s\t [%(processName)s:%(threadName)s, %(process)d:%(thread)8d] %(message)s'
logging.basicConfig(level=logging.INFO, format=FORMAT) def worker(n):
logging.info('begin to work-{}'.format(n))
time.sleep(5)
logging.info('finished {}'.format(n)) if __name__ == '__main__':
executer = futures.ProcessPoolExecutor(max_workers=3) # 创建进程池,池容量为3 with executer: #使用上下文改造进程池的例子,增加返回计算的结果
fs = []
for i in range(3):
future = executer.submit(worker, i)
fs.append(future) for i in range(3, 6):
future = executer.submit(worker, i)
fs.append(future) while True:
time.sleep(2)
logging.info(threading.enumerate())
flag = True
for f in fs: # 判断是否还有未完成的任务
logging.info(f.done())
flag = flag and f.done()
#if not flag: # 注释了这个if,输出的日志看的清楚些
# break print('-' * 30)
if flag:
break
#executer.shutdown() # 上下文清理了资源
logging.info('===end====')
logging.info(threading.enumerate()) # 多进程时看主线程已没有必要了
2019-12-04 19:25:33,520 [Process-1:MainThread, 16781:140736847635392] begin to work-0
2019-12-04 19:25:33,520 [Process-2:MainThread, 16782:140736847635392] begin to work-1
2019-12-04 19:25:33,521 [Process-3:MainThread, 16783:140736847635392] begin to work-2
2019-12-04 19:25:35,522 [MainProcess:MainThread, 16780:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(Thread-1, started daemon 123145557798912)>, <Thread(QueueFeederThread, started daemon 123145563054080)>]
2019-12-04 19:25:35,523 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:35,523 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:35,523 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:35,523 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:35,523 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:35,523 [MainProcess:MainThread, 16780:140736847635392] False
------------------------------
------------------------------
2019-12-04 19:25:37,527 [MainProcess:MainThread, 16780:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(Thread-1, started daemon 123145557798912)>, <Thread(QueueFeederThread, started daemon 123145563054080)>]
2019-12-04 19:25:37,527 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:37,527 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:37,527 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:37,527 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:37,527 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:37,527 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:38,521 [Process-1:MainThread, 16781:140736847635392] finished 0
2019-12-04 19:25:38,522 [Process-1:MainThread, 16781:140736847635392] begin to work-3
2019-12-04 19:25:38,522 [Process-2:MainThread, 16782:140736847635392] finished 1
2019-12-04 19:25:38,522 [Process-3:MainThread, 16783:140736847635392] finished 2
2019-12-04 19:25:38,523 [Process-2:MainThread, 16782:140736847635392] begin to work-4
2019-12-04 19:25:38,524 [Process-3:MainThread, 16783:140736847635392] begin to work-5
------------------------------
2019-12-04 19:25:39,532 [MainProcess:MainThread, 16780:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(Thread-1, started daemon 123145557798912)>, <Thread(QueueFeederThread, started daemon 123145563054080)>]
2019-12-04 19:25:39,532 [MainProcess:MainThread, 16780:140736847635392] True
2019-12-04 19:25:39,532 [MainProcess:MainThread, 16780:140736847635392] True
2019-12-04 19:25:39,532 [MainProcess:MainThread, 16780:140736847635392] True
2019-12-04 19:25:39,532 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:39,532 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:39,533 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:41,536 [MainProcess:MainThread, 16780:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(Thread-1, started daemon 123145557798912)>, <Thread(QueueFeederThread, started daemon 123145563054080)>]
2019-12-04 19:25:41,536 [MainProcess:MainThread, 16780:140736847635392] True
------------------------------
2019-12-04 19:25:41,536 [MainProcess:MainThread, 16780:140736847635392] True
2019-12-04 19:25:41,536 [MainProcess:MainThread, 16780:140736847635392] True
2019-12-04 19:25:41,536 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:41,536 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:41,536 [MainProcess:MainThread, 16780:140736847635392] False
2019-12-04 19:25:43,522 [Process-1:MainThread, 16781:140736847635392] finished 3
2019-12-04 19:25:43,524 [Process-2:MainThread, 16782:140736847635392] finished 4
2019-12-04 19:25:43,524 [Process-3:MainThread, 16783:140736847635392] finished 5
2019-12-04 19:25:43,537 [MainProcess:MainThread, 16780:140736847635392] [<_MainThread(MainThread, started 140736847635392)>, <Thread(Thread-1, started daemon 123145557798912)>, <Thread(QueueFeederThread, started daemon 123145563054080)>]
2019-12-04 19:25:43,538 [MainProcess:MainThread, 16780:140736847635392] True
2019-12-04 19:25:43,538 [MainProcess:MainThread, 16780:140736847635392] True
2019-12-04 19:25:43,538 [MainProcess:MainThread, 16780:140736847635392] True
2019-12-04 19:25:43,538 [MainProcess:MainThread, 16780:140736847635392] True
2019-12-04 19:25:43,538 [MainProcess:MainThread, 16780:140736847635392] True
2019-12-04 19:25:43,538 [MainProcess:MainThread, 16780:140736847635392] True
------------------------------
2019-12-04 19:25:43,541 [MainProcess:MainThread, 16780:140736847635392] ===end====
2019-12-04 19:25:43,542 [MainProcess:MainThread, 16780:140736847635392] [<_MainThread(MainThread, started 140736847635392)>]
以上代码执行结果戳这里
五.总结
该库统一了线程池、进程池调用,简化了编程。 是Python简单的思想哲学的体现。
唯一的缺点:无法设置线程名称。但这都不值一提。
Python并发编程-concurrent包的更多相关文章
- 深入理解java:2.3.4. 并发编程concurrent包 之容器ConcurrentLinkedQueue(非阻塞的并发队列---循环CAS)
1. 引言 在并发编程中我们有时候需要使用线程安全的队列. 如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法. 使用阻塞算法的队列可以用一个锁(入队和出 ...
- 深入理解java:2.3.6. 并发编程concurrent包 之管理类---线程池
我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁 ...
- 深入理解java:2.3.2. 并发编程concurrent包 之重入锁/读写锁/条件锁
重入锁 Java中的重入锁(即ReentrantLock) 与JVM内置锁(即synchronized)一样,是一种排它锁. ReentrantLock提供了多样化的同步,比如有时间限制的同步(定 ...
- 深入理解java:2.3.1. 并发编程concurrent包 之Atomic原子操作(循环CAS)
java中,可能有一些场景,操作非常简单,但是容易存在并发问题,比如i++, 此时,如果依赖锁机制,可能带来性能损耗等问题, 于是,如何更加简单的实现原子性操作,就成为java中需要面对的一个问题. ...
- 深入理解java:2.3.3. 并发编程concurrent包 之容器ConcurrentHashMap
线程不安全的HashMap 因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap. 效率低下的HashTable容器 H ...
- 深入理解java:2.3.5. 并发编程concurrent包 之容器BlockingQueue(阻塞队列)
1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列. 这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空. 当队列满时,存储元素的线程会等待队列 ...
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...
- 快速了解Python并发编程的工程实现(上)
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- Python 并发编程(下)
Python 并发编程(下) 课程目标:掌握多进程开发的相关知识点并初步认识协程. 今日概要: 多进程开发 进程之间数据共享 进程锁 进程池 协程 1. 多进程开发 进程是计算机中资源分配的最小单元: ...
随机推荐
- JAVA SpringBoot2 整合 ueditor 的 并实现前后端分离
1,下载 jsp 版本的 百度编辑器,点击此处下载 2,解压文件,解压后目录如下 3,我们将 jsp 目录暂时移动到别的地方,剩下的文件作为一个 H5 前端项目使用,笔者这边导入到 idea 进行开发 ...
- 使用 Alibaba 的 Homebrew 镜像源进行加速
使用 Alibaba 的 Homebrew 镜像源进行加速 平时我们执行 brew 命令安装软件的时候,跟以下 3 个仓库地址有关: brew.git homebrew-core.git homebr ...
- EF Core 多个DbContext迁移命令
如果涉及多个项目,注意保持DbContext所在项目和启动项目关于数据库的包引用版本一致 注意设置不同的DbContext迁移文件目录不同 1.Enable-migrations EntityFram ...
- Dede后台验证码不显示解决方法详解(dedecms 5.7 UTF-8版本)
织梦(dede)后台验证码不显示有多种可能性,我前几天测试就碰到了这个问题,结果百度搜索了一圈,挨个修改了下,还是不行,最后是在解决另外一个后台上传图片不成功的问题的时候,歪打正着的把验证码问题给解决 ...
- 修改IP地址之后认证信息问题
$ ssh lvph@172.16.20.20 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOT ...
- PHP7之Trait详解
转自: https://www.jianshu.com/p/fc053b2d7fd1 php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait ...
- 【剑指offer】对称的二叉树
题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 分析:从上到下直接遍历,利用栈或者队列暂存结点,注意结点的存和取都是成对的 c ...
- my97整合fineui例子,开始和结束时间
<f: Toolbar runat ="server"> <Items> ...
- 熟悉javaEE主流框架Spring boot,Spring Cloud,Mybatis,了解Servlet,JDBC
什么是Tomcat 阿帕奇提供的小型服务器软件,支持servet和jsp规范 lib包:存放jar包 WabApp:发布项目的目录 work:jsp编译生成.class的目录 LOgs:存放日志文件 ...
- 常用SQL指令
SQL去重复语句:select 改为Delete select * from TRWTC01 where ITEM_NAME in (select ITEM_NAME from TRWTC01 gro ...