并行编程
1._thread 模块有很多缺点,已很少使用
2.threading 模块
.Thread(target=目标函数, args=(参数元组))
自定义Thread派生类,重写run方法逻辑
启动线程:.start()
要求主线程等待:.join()
获取当前线程:.current_thread()
同步原语:锁 threading.Lock
获得:.acquire()
释放:.release()
支持上下文操作with lock:
queue 模块
构造实例.Queue(maxsize=0)
放入数据项.put(item, block=True, timeout=None)
获取数据项.get(block=True, timeout=None)
声明当前队列任务处理完毕.task_done()
队列所有项处理完毕前阻塞.join()
多进程
multiprocessing模块
充分运用多核、多CPU的计算能力,适用于计算密集型任务
concurrent.futures 模块
ThreadPoolExecutor
ProcessPoolExecutor
装饰器
自定义函数装饰器
def decorator(func):
def wrapper(*args, **kwargs):
return '<title>'+func(*args, **kwargs) +'</title>'
return wrapper
@decorator
def get_text():
return 'hello world!'
print(get_text())
结果
<title>hello world!</title>
装饰器就相当于把函数当参数传递给了装饰器,再执行装饰器的那个函数
类装饰器
class P:
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
return '{' + self.func(*args, **kwargs) + '}'
@P
def get_text():
return "helloworld"
print(get_text())
结果
{helloworld}
类装饰器和函数装饰器都能修饰一个函数,但如果是类的函数,建议用函数装饰器,用类装饰器会报错,处理比较麻烦
装饰器参数
装饰器参数,可以再让装饰器带参数,让函数更灵活
def tags(tag):
def tag_decorator(func):
def wrapper(*args, **kwargs):
return f'<{tag}>{func(*args, **kwargs)}</{tag}>'
return wrapper
return tag_decorator
@tags('div')
def get_text():
return "helloworld"
print(get_text())
结果
<div>helloworld</div>