Python基础知识(十一)

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'))

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值