并发编程学习笔记 基于Python( 二 )


P6 线程安全问题
线程安全概念介绍
Lock用于解决线程安全问题
实例代码演示问题以及解决方案
# Lock_concurrent.pyimport threadingimport timelock = threading.Lock()class Account:# 创建Circle类def __init__(self, balance):# 约定成俗这里应该使用r,它与self.r中的r同名self.balance = balancedef draw(account, amount):with lock:if account.balance >= amount:time.sleep(0.1)print(threading.current_thread().name, "successful")account.balance -= amountprint(threading.current_thread().name, "balance", account.balance)else:print(threading.current_thread().name, "failed")if __name__ == "__main__":account = Account(1000)ta = threading.Thread(name="ta", target=draw, args=(account, 800))tb = threading.Thread(name="tb", target=draw, args=(account, 800))ta.start()tb.start()
P7 线程池
线程池的原理
使用线程池的好处
的使用方法

并发编程学习笔记 基于Python

文章插图
使用线程池改造爬虫程序
# thread_pool.pyimport concurrent.futuresimport blog_spider# crawwith concurrent.futures.ThreadPoolExecutor() as pool:htmls = pool.map(blog_spider.craw, blog_spider.urls)htmls = list(zip(blog_spider.urls, htmls))for url, html in htmls:print(url, len(html))# futures = [pool.submit(blog_spider.craw, url) for url in blog_spider.urls]# for future in futures:#print(future.result())# for future in as_completed(futures):#print(future.result())print("craw over")# parsewith concurrent.futures.ThreadPoolExecutor() as pool:futures = {}for url, html in htmls:future = pool.submit(blog_spider.parse, html)futures[future] = urlfor future, url in futures.items():print(url, future.result())# for future in concurrent.futures.as_completed(futures):#url = futures[future]#print(url, future.result())
P8 在Web服务中使用线程池加速
web服务的架构以及特点
使用线程池 加速
代码用Flask实现Web服务并实现加速
#flask_thread_pool.pyimport jsonimport flaskimport timefrom concurrent.futures import ThreadPoolExecutorpool = ThreadPoolExecutor()app = flask.Flask(__name__)def read_file():time.sleep(0.1)print('file')return "file result"def read_db():time.sleep(0.2)print('db')return "db result"def read_api():time.sleep(0.3)print('api')return "api result"@app.route("/")def index():start = time.time()result_file = pool.submit(read_file)result_db = pool.submit(read_db)result_api = pool.submit(read_api)# result_file = read_file()# result_db = read_db()# result_api = read_api()end = time.time()return json.dumps({"result_file": result_file.result(),"result_db": result_db.result(),"result_api": result_api.result(),# "result_file": result_file,# "result_db": result_db,# "result_api": result_api,"time": end - start,})if __name__ == "__main__":app.run()
P9多进程
Why
梳理
代码实战:单线程、多线程、多进程对CPU密集型计算速度的影响
, cost: 36. sec
, cost: 37. sec
, cost: 6.4839 sec
#Thread_process_cpu_borad.pyimport mathfrom concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutorimport time# 导入100个大素数PRIMRS = [112272535095293] * 100# 函数用来判断是否为素数def is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falsesqrt_n = int(math.floor(math.sqrt(n)))for i in range(3, sqrt_n + 1, 2):if n % i == 0:return Falsereturn Truedef single_thread():for number in PRIMRS:is_prime(number)def multi_thread():with ThreadPoolExecutor() as pool:pool.map(is_prime, PRIMRS)def multi_process():with ProcessPoolExecutor() as pool:pool.map(is_prime, PRIMRS)if __name__ == "__main__":start = time.time()single_thread()end = time.time()print("single_thread, cost:", end - start, "sec")start = time.time()multi_thread()end = time.time()print("multi_thread, cost:", end - start, "sec")start = time.time()multi_process()end = time.time()print("multi_process, cost:", end - start, "sec")