文章目录
Python基础知识(十一)
一、并发进程
(一)概述
非并发程序:程序由单个步骤序列构成
包含独立子任务的程序执行性能低
并发:异步、高效
分解子任务、简化流程与逻辑
进程process 一个程序的执行实例
每个进程有自己的地址空间、内存、数据栈及辅助数据
线程hread 同一个线程内,可被并行激活的控制流
共享相同上下文(空间地址、数据结构)
特点: 便于信息共享和通信
线程访问顺序差异会导致结果不一致(条件 race condition)
Python GIL 全局解释器 Global Interpreter Lock
Python 代码由虚拟机(解释器主循环)控制‘
主循环同时只能有一个控制线程执行’
import time
__author__ = "Eason"
__copyright__ = "Copyright 2013-2017, codeclassroom.com"
def worker(n):
print('函数执行开始于:{}'.format(time.ctime()))
time.sleep(n)
print(f'函数执行结束于:{time.ctime()}')
def main():
print(f'[主函数执行开始于:{time.ctime()}]')
worker(4)
worker(2)
print(f'[主函数执行结束于:{time.ctime()}]')
if __name__ == '__main__':
main()
运行结果
(二)多线程
(1)_thread模块
使用多线程可以使多个进程并发执行,但是必须提前知道每个线程的运行时间
import time
import _thread
__author__ = 'Eason'
__copyright__ = "Copyright 2013-2017,codeclassroom.com"
def worker(n):
print('函数执行开始于:{}'.format(time.ctime()))
time.sleep(n)
print(f'函数执行结束于:{time.ctime()}')
def main():
print(f'[主函数执行开始于:{time.ctime()}]')
_thread.start_new_thread(worker,(4,))
_thread.start_new_thread(worker,(2,))
time.sleep(6)
print(f'[主函数执行结束于:{time.ctime()}]')
if __name__ == '__main__':
main()
运行结果
(2)threading模块
import threading
__author__ = 'Eason'
__copyright__ = "Copyright 2013-2017,codeclassroom.com"
def worker(n):
print('函数执行开始于:{}'.format(time.ctime()))
time.sleep(n)
print(f'函数执行结束于:{time.ctime()}')
def main():
print(f'[主函数执行开始于:{time.ctime()}]')
# _thread.start_new_thread(worker,(4,))
# _thread.start_new_thread(worker,(2,))
threads = []
t1 = threading.Thread(target = worker,args = (4,))
threads.append(t1)
t2 = threading.Thread(target = worker, args = (2,))
threads.append(t2)
for t in threads:
t.start()
for t in threads:
t.join()
# time.sleep(6)
print(f'[主函数执行结束于:{time.ctime()}]')
if __name__ == '__main__':
main()
运行结果:
(3)同步原语(锁)
import threading
import time
import random
__author__ = "Eason"
__copyright__ = "Copyright 2013-2017,codeclassroom.com"
eggs = []
lock = threading.Lock()
def put_egg(n,lst):
# lock.acquire()
with lock:
for i in range(1, n+1):
time.sleep(random.randint(0, 2))
lst.append(i)
# lock.release()
def main():
threads = []
for i in range(3):
t = threading.Thread(target= put_agg,args = (5,eggs))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
print(eggs)
if __name__ == '__main__':
main()
运行结果:
(三)队列
queue 模块 Queue FIFO .Queue(maxsize = 0) 构造实例
.put(item,block = True, timeout = None) 放入数据项
.get(block = True, timeout = None) 获取数据项
.task.done() 声明当前任务队列任务处理完毕
LifoQueue LIFO
PriorityQueue 优先队列
先进先出队列
import threading
import queue
import time
import random
__author__ = "Eason"
__copyright__ ="Copyright 2013-2017, codeclassroom.com"
def producer(data_queue):
for i in range(5):
time.sleep(0.5)
item = random.randint(1,100)
data_queue.put(item)
print(f'{threading.current_thread().name}在队列中放入数据项:{item}')
def consumer(data_queue):
while True:
try:
item = data_queue.get(timeout = 3)
print(f'{threading.current_thread().name}从队列中移除了{item}')
except queue.Empty:
break
else:
data_queue.task_done()
def main():
q = queue.Queue()
threads = []
p = threading.Thread(target = producer,args = (q,))
p.start()
for i in range(2):
c = threading.Thread(target = consumer,args = (q,))
threads.append(c)
for t in threads:
t.start()
for t in threads:
t.join()
if __name__ == '__main__':
main()
运行结果:
import multiprocessing
import time
__author__ = "Eason"
__copyright__ = "Copyright 2013-2017, codeclassroom.com"
def func(n):
print(f'{multiprocessing.current_process().name} 执行开始于:{time.ctime()}')
time.sleep(n)
print(f'{multiprocessing.current_process().name} 执行结束于:{time.ctime()}')
def main():
print(f'主函数运行于:{time.ctime()}')
processes = []
p1 = multiprocessing.Process(target = func, args =(4,))
processes.append(p1)
p2 = multiprocessing.Process(target=func, args=(2,))
processes.append(p2)
for p in processes:
p.start()
for p in processes:
p.join()
print(f'主函数结束于:{time.ctime()}')
if __name__ == '__main__':
main()
运行结果:
(四)multiprocessing模块 充分运用多核、多CPU的计算能力,适用于计算密集型任务 concurrent.futures模块
concurrent.futures应用
import time
import concurrent.futures
__author__ = "Eason"
__copyright__ = "Copyright 2013-2017, codeclassroom.com"
numbers = list(range(1,11))
def count(n):
for i in range(10000000):
i += i
return i * n
def worker(x):
result = count(x)
print(f'数字:{x} 的计算结果是:{result}')
# 顺序执行
def sequential_execution():
start_time = time.clock()
for i in numbers:
worker(i)
print(f'顺序执行花费时间:{time.clock()-start_time}秒')
# 线程池执行
def threading_execution():
start_time = time.clock()
with concurrent.futures.ThreadPoolExecutor(max_workers = 5) as executor:
for i in numbers:
executor.submit(worker,i)
print(f'线程池执行花费时间:{time.clock()-start_time}秒')
# 进程池执行
def process_execution():
start_time = time.clock()
with concurrent.futures.ProcessPoolExecutor(max_workers = 5) as executor:
for i in numbers:
executor.submit(worker, i)
print(f'进程池执行花费时间:{time.clock()-start_time}秒')
if __name__ == '__main__':
sequential_execution()
运行结果:
二、装饰器
(一)概述
用于管理和增强函数和类行为的代码
提供一种在函数或类定义中插入自动运行代码的机制
特点:更明确的语法
更高的代码可维护性
更好的一致性
(二)编写
(1)函数基础
将函数赋给变量
>>>def hello(name):
… print('Hello',name)
…
>>>hello('Tom')
Hello Tom
>>>type(hello)
<class 'function'>
>>>hello
<function hello at 0x000001E60773B510>
>>>greeting = hello
>>>greeting
<function hello at 0x000001E60773B510>
>>>greeting = hello
>>>greeting
<function hello at 0x000001E60773B510>
>>>hello('Tom')
Hello Tom
>>>greeting('Jerry')
Hello Jerry
将函数作为参数传递
>>>def add(a,b):
… return a + b
…
>>>def subtract(a,b):
… return a-b
…
>>>add(3,5)
8
>>>subtract(5,3)
2
>>>def action(x,y,func):
… return func(x,y)
…
>>>action(5,3,add)
8
>>>action(5,3,subtract)
2
>>>action(5,3,lambda x, y: x*y)
15
函数嵌套及跨域访问
>>>def greeting():
… def hello():
… return 'Hello'
… return hello
…
>>>greeting()
'Hello'
>>>def greeting():
… def hello():
… return 'Hello'
… return hello
…
>>>greeting()
<function greeting.<locals>.hello at 0x0000025526DFB378>
>>>greeting()()
'Hello'
>>>def func_1():
... x = 10
... def func_2():
... x = 20
... return x +10
... return func_2()
...
>>>func_1()
30
>>>def func_1():
... x = 10
... def func_2():
... nonlocal x
... return x+10
... return func_2()
...
>>>func_1()
20
(2)函数定义装饰器
在func_decorator.py文件中
__author__ = "Eason"
__copyright__ = "Copyright 2013-2017,codeclassroom.com"
def p_decorator(func):
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper
def get_text():
return '欢迎学习优品课堂课程'
if __name__ == '__main__':
print(get_text())
运行结果:
在func_decorator.py文件中
__author__ = "Eason"
__copyright__ = "Copyright 2013-2017,codeclassroom.com"
def p_decorator(func):
def wrapper(*args,**kwargs):
return '<p>'+ func(*args,**kwargs)+'</p>'
return wrapper
@p_decorator
def get_text():
return '欢迎学习优品课堂课程'
@p_decorator
def get_upper_text(text):
return text.upper()
if __name__ == '__main__':
# html = p_decorator(get_text)
# print(html())
# print(get_text())
print(get_upper_text('www.codeclassroom.com'))
在person.py文件中
__author__ = "Eason"
__copyright__ = "Copyright 2013-2017,codeclassroom.com"
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def say(self,word):
print(f'{self.name}说:{word}')
@staticmethod
def do_something():
pass
运行结果:
(3)类定义装饰器
在cls_decorator.py中
__author__ = "Eason"
__copyright__ = "Copyright 2013-2017,codeclassroom.com"
class P:
def __init__(self,func):
self.func = func
def __call__(self,*args,**kwargs):
return '<p>' + self.func(*args,**kwargs) + '</p>'
@P
def get_text():
return '欢迎学习优品课堂课程'
@P
def get_upper_text(text):
return text.upper()
if __name__ == '__main__':
print(get_upper_text('codeclassroom.com'))
运行结果:
(3)装饰器参数
__author__ = "Eason"
__copyright__ = "Copyright 2013-2017,codeclassroom.com"
#参数化装饰器
def tags(tag):
def tag_decorator(func):
def wrapper(*args,**kwargs):
return '<{tag}>{func(*args,**kwargs)}</{tag}>'
return wrapper
return tag_decorator
def p_decorator(func):
def wrapper(*args,**kwargs):
return '<p>'+ func(*args,**kwargs)+'</p>'
return wrapper
def div_decorator(func):
def wrapper(*args,**kwargs):
return '<div>{}</div>'.format(func(*args,**kwargs))
return wrapper
class Student:...
def get_text():
return '欢迎学习优品课堂课程'
@tags('body')
@tags('div')
@tags('p')
def get_upper_text(text):
return text.upper()
if __name__ == '__main__':
# html = p_decorator(get_text)
# print(html())
# print(get_text())
print(get_upper_text('www.codeclassroom.com'))
运行结果: