并行编程概述

并发编程

多线程之——threa模块

>>> import time
>>> time.ctime()
'Thu Jan  9 07:52:57 2020'
import time

"""单线程示例
"""

def worker(n):
    print(f'函数执行开始于:{time.ctime()}')
    time.sleep(n)#休眠时间
    print(f'函数执行结束于:{time.ctime()}')

def mian():
    print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
    worker(4)#执行4秒
    worker(2)#执行2秒
    print(f'【主函数执行结束于:{time.ctime()}】')

if __name__ == '__main__':
    mian()  

结果

【主函数执行开始于:Thu Jan  9 08:00:57 2020】
函数执行开始于:Thu Jan  9 08:00:57 2020
函数执行结束于:Thu Jan  9 08:01:01 2020
函数执行开始于:Thu Jan  9 08:01:01 2020
函数执行结束于:Thu Jan  9 08:01:03 2020
【主函数执行结束于:Thu Jan  9 08:01:03 2020】 

多线程

_thread模式弊端并不能决定函数 程序什么时候结束

import time
import _thread


"""_thread 实现多线程
"""

def worker(n):
    print(f'函数执行开始于:{time.ctime()}')
    time.sleep(n)#休眠时间
    print(f'函数执行结束于:{time.ctime()}')

def mian():#多线程只修改main函数
    print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
    _thread.start_new_thread(worker,(4,))#开始一个新的线程,function函数名称叫worker,args传递参数,以元组形式展现
    _thread.start_new_thread(worker, (2,))
    print(f'【主函数执行结束于:{time.ctime()}】')

if __name__ == '__main__':
    mian()  

结果

【主函数执行开始于:Thu Jan  9 08:14:44 2020】
【主函数执行结束于:Thu Jan  9 08:14:44 2020】

想执行等一等 就是加上time sleep

import time
import _thread


"""_thread 实现多线程
"""

def worker(n):
    print(f'函数执行开始于:{time.ctime()}')
    time.sleep(n)#休眠时间
    print(f'函数执行结束于:{time.ctime()}')

def mian():#多线程只修改main函数
    print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
    _thread.start_new_thread(worker,(4,))#开始一个新的线程,function函数名称叫worker,args传递参数,以元组形式展现
    _thread.start_new_thread(worker, (2,))

    time.sleep(6)
    print(f'【主函数执行结束于:{time.ctime()}】')

if __name__ == '__main__':
    mian()

threading 模块

主函数的主线程没有和子线程同步

import time
import threading


"""threading.Thread() 实现多线程
"""

def worker(n):
    print(f'函数执行开始于:{time.ctime()}')
    time.sleep(n)#休眠时间
    print(f'函数执行结束于:{time.ctime()}')

def mian():#多线程只修改main函数
    print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
    #_thread.start_new_thread(worker,(4,))#开始一个新的线程,function函数名称叫worker,args传递参数,以元组形式展现
    #_thread.start_new_thread(worker, (2,))

    threads = []#先申请一个数组让他为空
    t1 = threading.Thread(target=worker, args=(4,))#构造一个他t1线程,执行目标函数,atgs耗费4秒
    threads.append(t1) #追加t1线程

    t2 = threading.Thread(target=worker, args=(2,))
    threads.append(t2)

    for t in threads:
        t.start()


    #time.sleep(6)
    print(f'【主函数执行结束于:{time.ctime()}】')

if __name__ == '__main__':
    mian()

理想状态是等待当前状态执行完毕之后再主线程执行完

import time
import threading


"""threading.Thread() 实现多线程
"""

def worker(n):
    print(f'函数执行开始于:{time.ctime()}')
    time.sleep(n)#休眠时间
    print(f'函数执行结束于:{time.ctime()}')

def mian():#多线程只修改main函数
    print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
    #_thread.start_new_thread(worker,(4,))#开始一个新的线程,function函数名称叫worker,args传递参数,以元组形式展现
    #_thread.start_new_thread(worker, (2,))

    threads = []#先申请一个数组让他为空
    t1 = threading.Thread(target=worker, args=(4,))#构造一个他t1线程,执行目标函数,atgs耗费4秒
    threads.append(t1) #追加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__':
    mian()
import time
import threading


"""threading.Thread() 实现多线程
"""

def worker(n):
    print('{} 函数执行开始于:{}'.format(threading.current_thread().name, time.ctime()))#出现当前线程名称
    time.sleep(n)#休眠时间
    print(f'{threading.current_thread().name} 函数执行结束于:{time.ctime()}')#获得当前线程

def mian():#多线程只修改main函数
    print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
    #_thread.start_new_thread(worker,(4,))#开始一个新的线程,function函数名称叫worker,args传递参数,以元组形式展现
    #_thread.start_new_thread(worker, (2,))

    threads = []#先申请一个数组让他为空
    t1 = threading.Thread(target=worker, args=(4,))#构造一个他t1线程,执行目标函数,atgs耗费4秒
    threads.append(t1) #追加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__':
    mian()

结果

【主函数执行开始于:Thu Jan  9 10:33:17 2020】
Thread-1 函数执行开始于:Thu Jan  9 10:33:17 2020
Thread-2 函数执行开始于:Thu Jan  9 10:33:17 2020
Thread-2 函数执行结束于:Thu Jan  9 10:33:19 2020
Thread-1 函数执行结束于:Thu Jan  9 10:33:21 2020
【主函数执行结束于:Thu Jan  9 10:33:21 2020】

 派生类

import time
import threading


"""threading.Thread() 实现多线程
"""

def worker(n):
    print('{} 函数执行开始于:{}'.format(threading.current_thread().name, time.ctime()))#出现当前线程名称
    time.sleep(n)#休眠时间
    print(f'{threading.current_thread().name} 函数执行结束于:{time.ctime()}')#获得当前线程

class MyThread(threading.Thread):#继承基类
    def __init__(self, func, args):#指定信息
        threading.Thread.__init__(self)
        self.func = func
        self.args = args

    def run(self):
        self.func(*self.args)

def mian():#多线程只修改main函数
    print(f'【主函数执行开始于:{time.ctime()}】')#f格式化字符串
    #_thread.start_new_thread(worker,(4,))#开始一个新的线程,function函数名称叫worker,args传递参数,以元组形式展现
    #_thread.start_new_thread(worker, (2,))

    threads = []#先申请一个数组让他为空
    t1 = MyThread(worker, (4,))
    threads.append(t1) #追加t1线程

    #t2 = threading.Thread(target=worker, args=(2,))
    t2 = MyThread(worker,(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__':
    mian()

结果

【主函数执行开始于:Thu Jan  9 10:44:08 2020】
Thread-1 函数执行开始于:Thu Jan  9 10:44:08 2020
Thread-2 函数执行开始于:Thu Jan  9 10:44:08 2020
Thread-2 函数执行结束于:Thu Jan  9 10:44:10 2020
Thread-1 函数执行结束于:Thu Jan  9 10:44:12 2020
【主函数执行结束于:Thu Jan  9 10:44:12 2020】

同步锁

import threading
import time

"""同步原语之:锁
"""

eggs = []

def put_egg(n, lst):
    for i in range(1,n+1):#做遍历
        lst.append(i)


def main():
    threads = [] #变量等于数组

    for i in range(3):
        t = threading.Thread(target=put_egg,args=(5,eggs))
        threads.append(t)

    for t in threads:
        t.start()

    for t in threads:
        t.join()

    print(eggs)

if __name__ == '__main__':
   main()

结论

[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
import threading
import time
import random

"""同步原语之:锁
"""

eggs = []
lock = threading.Lock()#声明变量

def put_egg(n, lst):
    lock.acquire()
    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_egg,args=(5,eggs))
        threads.append(t)

    for t in threads:
        t.start()

    for t in threads:
        t.join()

    print(eggs)

if __name__ == '__main__':
   main()

 qunue队列

由生产者每个半秒向队列里放入一个随机数,总共放5个,先进先出,在队列里有消费者线程来取到某一项进行处理,

处理完毕后一个task——down告诉任务结束,取内容有个超时操作3秒,取不到就不取得到一个空的异常

import threading #输入模块
import queue#队列模块
import time#时间模块
import random#使用随机数

"""LIFO 队列示例
"""

def producer(data_queue):#定义生产者函数
    for i in range(5):#循环5次
        time.sleep(0.5)#每循环一次停留一会儿
        item = random.randint(1, 100)#1-100间随便一个数字
        data_queue.put(item)#队列里放入一个信息,把item放入进去
        print(f'{threading.current_thread().name} 在队列中放入数据项:{item}') #放入对象到队列的方法

def consumer(data_queue):
    while True:
        try:
            item = data_queue.get(timeout=3)#获取信息,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()#让主线程等待当前线程执行完毕

    q.join()#让主线程等待整个队列的操作

if __name__ == '__main__':
    main()

import multiprocessing
import time

"""多进程示例
"""

def func(n):
    print(f'{multiprocessing.current_process().name} 执行开始于:{time.ctime()}')#当前进程有个属性叫name
    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)

    print(f'主函数结束于:{time.ctime()}')

if __name__ == '__main__':
    main()



    print(f'主函数结束于:{time.ctime()}')

 

更多并行编程

import time
import concurrent.futures

"""concurrent.futures应用
"""
numbers = list(range(1,11))#做一个列表,生成范围1-10

def count(n):#定义函数,接收参数n
    for i in range(1000000):
        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()
    #threading_execution()
    process_execution()

 函数基础

 

将函数赋给变量

In[2]: def hello(name):
  ...:     print('Hello ', name)
  ...:     
In[3]: hello('Tom')#函数名称加特定参数
Hello  Tom
In[4]: type(hello)#用type检查
Out[4]: function
In[5]: hello
Out[5]: <function __main__.hello(name)>
In[6]: greeting = hello
In[7]: greeting
Out[7]: <function __main__.hello(name)>
In[8]: hello('Tom')
Hello  Tom
In[9]: greeting('Jerry')
Hello  Jerry

将函数作为参数传递

In[2]: def add(a, b):#把两个参数相加
  ...:     return a + b
  ...: 
In[4]: def subtract(a, b):
  ...:     return a - b
  ...: 
In[5]: add(3,5)
Out[5]: 8
In[6]: subtract(5,3)
Out[6]: 2
In[7]: def action(x, y, func):
  ...:     return func(x, y)
  ...: 
In[8]: action(5, 3, add)
Out[8]: 8
In[9]: action(5, 3, subtract)
Out[9]: 2
In[10]: action(5, 3, lambda x, y:x*y)
Out[10]: 15

函数嵌套及跨域访问

加括号是返回执行结果,不加括号是返回当前的对象

 
 

>>> def greeting():#定义函数greeting
... def hello():#函数里定义一个函数greeting
... return 'Hello'
... return hello()#hello作为一个字符串在greeting结果返回
...
>>> greeting()#调用
'Hello'
>>> def greeting():
... def hello():
... return 'Hello'
... return hello
...
>>> greeting()
<function greeting.<locals>.hello at 0x00000000037E31E0>
>>> greeting()()#想执行再写个括号
'Hello'

 

 函数嵌套域成员访问

>>> def func_1():
...     x = 10
...     def func_2():
...         x = 20
...         return x + 10
...     return func_2()
... 
>>> func_1()#用的是本地变量与外侧
30

想用func1里func2外面的
>> def func_1():
...     x = 10
...     def func_2():
...         nonlocal x #非本地的x,使用上一层函数封装区域
...         return x + 10
...     return func_2()
... 
>>> func_1()
20

 函数定义装饰器

"""函数定义装饰器
"""

def p_decoratior(func):#把gettext传入装饰器里
    def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
        return '<p>' +  func(*args,**kwargs) + '</p>'

    return wrapper

@p_decoratior#对gettext做个装饰器,进行装饰
def get_text():
    return '欢迎学习优品课堂课程'

if __name__ == '__main__':
    print(get_text())

"""函数定义装饰器
"""

def p_decoratior(func):#把gettext传入装饰器里
    def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
        return '<p>' +  func(*args,**kwargs) + '</p>'

    return wrapper

#@p_decoratior#对gettext做个装饰器,进行装饰
def get_text():
    return '欢迎学习优品课堂课程'

if __name__ == '__main__':
   html = p_decoratior(get_text)#把gettext函数作为参数传递到decoratorfunc里
   print(html())#结果返回的字符串再打印
"""函数定义装饰器
"""

def p_decoratior(func):#把gettext传入装饰器里
    def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
        return '<p>' +  func(*args,**kwargs) + '</p>'

    return wrapper

@p_decoratior#对gettext做个装饰器,进行装饰
def get_text():
    return '欢迎学习优品课堂课程'

def get_upper_text(text):
    return text.upper()

if __name__ == '__main__':
   print(get_upper_text('www.codeclassroom.com'))

装饰器修饰

"""函数定义装饰器
"""

def p_decoratior(func):#把gettext传入装饰器里
    def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
        return '<p>' +  func(*args,**kwargs) + '</p>'

    return wrapper

@p_decoratior#对gettext做个装饰器,进行装饰
def get_text():
    return '欢迎学习优品课堂课程'

@p_decoratior
def get_upper_text(text):
    return text.upper()

if __name__ == '__main__':
   print(get_upper_text('www.codeclassroom.com'))

 类定义装饰器

"""类定义装饰器
"""

class P:
    def __init__(self, func): #构造传递函数
        self.func = func

    def __call__(self, *args, **kwargs):#调用
        return '<p>' + self.func(*args,**kwargs) + '</p>'#返回p标签加/p标签

def get_text():
    return '欢迎学习优品课堂课程'

def get_upper_text(text):
    return text.upper()

if __name__ == '__main__':
    print(get_text())#未加修饰的

想修饰

"""类定义装饰器
"""

class P:
    def __init__(self, func): #构造传递函数
        self.func = func

    def __call__(self, *args, **kwargs):#调用
        return '<p>' + self.func(*args,**kwargs) + '</p>'#返回p标签加/p标签

@P
def get_text():
    return '欢迎学习优品课堂课程'

def get_upper_text(text):
    return text.upper()

if __name__ == '__main__':
    print(get_text())#未加修饰的

函数定义装饰器

"""函数定义装饰器
"""

def p_decoratior(func):#把gettext传入装饰器里
    def wrapper(*args,**kwargs):#args元组,kwargs有名字的参数,任何类型参数都可通过它来表示
        return '<p>' +  func(*args,**kwargs) + '</p>'

    return wrapper

class Student:
    def __init__(self, name):
        self.name = name


    @p_decoratior
    def get_name(self):
        return self.name.upper()

@p_decoratior#对gettext做个装饰器,进行装饰
def get_text():
    return '欢迎学习优品课堂课程'

@p_decoratior
def get_upper_text():
    return text.upper()

if __name__ == '__main__':
    s = Student('Mike')
    print(s.get_name())

类定义装饰器

"""类定义装饰器
"""

class P:
    def __init__(self, func): #构造传递函数
        self.func = func

    def __call__(self, *args, **kwargs):#调用
        return '<p>' + self.func(*args,**kwargs) + '</p>'#返回p标签加/p标签

class Student:
    def __init__(self,name):
        self.name = name

    def get_name(self):
        return self.name.upper()

@P
def get_text():
    return '欢迎学习优品课堂课程'

@P
def get_upper_text(text):
    return text.upper()

if __name__ == '__main__':
    s = Student('John')
    print(s.get_name())

参数化装饰器

"""函数定义装饰器
"""

def p_decorator(func):#把gettext传入装饰器里
    def wrapper(*args,**kwargs):#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:...


@p_decorator#对gettext做个装饰器,进行装饰
def get_text():
    return '欢迎学习优品课堂课程'

@div_decorator
def get_upper_text(text):
    return text.upper()

if __name__ == '__main__':
    print(get_upper_text('www.codeclassroom.com'))

 再加个@p_decorator,看看修饰的先后

"""函数定义装饰器
"""

def p_decorator(func):#把gettext传入装饰器里
    def wrapper(*args,**kwargs):#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:...


@p_decorator#对gettext做个装饰器,进行装饰
def get_text():
    return '欢迎学习优品课堂课程'

@div_decorator
@p_decorator
def get_upper_text(text):
    return text.upper()

if __name__ == '__main__':
    print(get_upper_text('www.codeclassroom.com'))

不加装饰器 原本返回一个地址

"""函数定义装饰器
"""

#参数化装饰器
def tags(tag):
    def tag_decorator(func):
        def wrapper(*args,**kwargs):
            return f'<{tag}>{func(*args,**kwargs)}</{tag}>'#返回格式化字符串
        return wrapper

    return tag_decorator


def p_decorator(func):#把gettext传入装饰器里
    def wrapper(*args,**kwargs):#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:...


#@p_decorator#对gettext做个装饰器,进行装饰
def get_text():
    return '欢迎学习优品课堂课程'

#@div_decorator
#@p_decorator()
def get_upper_text(text):
    return text.upper()

if __name__ == '__main__':
    print(get_upper_text('www.codeclassroom.com'))

加一个标签,装饰器叫tags

"""函数定义装饰器
"""

#参数化装饰器
def tags(tag):
    def tag_decorator(func):
        def wrapper(*args,**kwargs):
            return f'<{tag}>{func(*args,**kwargs)}</{tag}>'#返回格式化字符串
        return wrapper

    return tag_decorator


def p_decorator(func):#把gettext传入装饰器里
    def wrapper(*args,**kwargs):#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:...


#@p_decorator#对gettext做个装饰器,进行装饰
def get_text():
    return '欢迎学习优品课堂课程'

#@div_decorator
#@p_decorator()

@tags('p')#加标签
def get_upper_text(text):
    return text.upper()

if __name__ == '__main__':
    print(get_upper_text('www.codeclassroom.com'))

想变div

"""函数定义装饰器
"""

#参数化装饰器
def tags(tag):
    def tag_decorator(func):
        def wrapper(*args,**kwargs):
            return f'<{tag}>{func(*args,**kwargs)}</{tag}>'#返回格式化字符串
        return wrapper

    return tag_decorator


def p_decorator(func):#把gettext传入装饰器里
    def wrapper(*args,**kwargs):#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:...


#@p_decorator#对gettext做个装饰器,进行装饰
def get_text():
    return '欢迎学习优品课堂课程'

#@div_decorator
#@p_decorator()

@tags('div')#加标签
def get_upper_text(text):
    return text.upper()

if __name__ == '__main__':
    print(get_upper_text('www.codeclassroom.com'))
"""函数定义装饰器
"""

#参数化装饰器
def tags(tag):
    def tag_decorator(func):
        def wrapper(*args,**kwargs):
            return f'<{tag}>{func(*args,**kwargs)}</{tag}>'#返回格式化字符串
        return wrapper

    return tag_decorator


def p_decorator(func):#把gettext传入装饰器里
    def wrapper(*args,**kwargs):#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:...


#@p_decorator#对gettext做个装饰器,进行装饰
def get_text():
    return '欢迎学习优品课堂课程'

#@div_decorator
#@p_decorator()

@tags('div')#加标签
@tags('p')
def get_upper_text(text):
    return text.upper()

if __name__ == '__main__':
    print(get_upper_text('www.codeclassroom.com'))

 python sublime text python 配置

 

猜你喜欢

转载自www.cnblogs.com/shirleysu90/p/12169463.html