• 7.20 python线程3


    2018-7-20 18:46:49 去俺弟家玩去 后天回来

    1.复习

    # !/usr/bin/env python
    # !--*--coding:utf-8 --*--
    # !@Time    :2018/7/20 8:56
    # !@Author   TrueNewBee
    
    # 正确的学习方法
    #       input
    #       output
    #       correct 纠正
    
    # 线程:
    #   1.线程是进程中的执行单位
    #   2.线程是cpu执行的最小单位
    #   3.线程之间资源共享
    #   4.线程的开启和关闭以及切换的时间开销远远小于进程
    #   5.线程本身可以在同一时间使用多个cpu
    # python 与 线程
    #   CPython解释器在解释代码过程中容易产生数据不安全的问题
    #   GIL全局解释器锁 锁的是线程
    # threading

    2.守护线程

    # !/usr/bin/env python
    # !--*--coding:utf-8 --*--
    # !@Time    :2018/7/20 9:04
    # !@Author   TrueNewBee
    import time
    from threading import Thread
    
    
    def func1():
        while True:
            print('*'*10)
            time.sleep(1)
    
    
    def func2():
        print('in func2')
        time.sleep(5)
    
    
    if __name__ == '__main__':
        t = Thread(target=func1, )
        t.daemon = True
        t.start()
        t2 = Thread(target=func2, )
        t2.start()
        t2.join()
        print('主线程')
    
    # 守护进程随着主进程代码的结束而结束(进程间资源不共享,所以想咋结束咋结束)
    # 守护线程会在主线程结束之后等待其他子线程的结束才结束(线程间资源共享,所以不能主线程不能立马结束)
    
    # 主进程在执行完自己的代码之后不会立即结束,而是等待子进程结束之后 挥手子进程的资源
    
    # import time
    # from multiprocessing import Process
    #
    #
    # def func():
    #     time.sleep(5)
    #
    #
    # if __name__ == '__main__':
    #     Process(target=func, ).start()

    3.锁

    # !/usr/bin/env python
    # !--*--coding:utf-8 --*--
    # !@Time    :2018/7/20 9:29
    # !@Author   TrueNewBee
    # import time
    # from threading import Thread, Lock
    
    
    # def func(lock1):
    #     global n
    #     lock1.acquire()  # 加上一个锁
    #     # n = 1  python内部就是下面执行的
    #     temp = n
    #     time.sleep(0.2)
    #     n = temp - 1    # 9 刚取回来还没来得及赋值又被别人拿走了,所以得自己加个锁不让被人拿走
    #     lock1.release()  # 换钥匙
    #
    #
    # n = 10
    # t_list = []
    # lock = Lock()
    # for i in range(10):
    #     t = Thread(target=func, args=(lock, ))
    #     t.start()
    #     t_list.append(t)
    # for t in t_list:
    #     t.join()
    # print(n)    # 不加锁是9 加锁是 0
    
    # 科学家吃面问题 经典死锁问题
    # noodle_lock = Lock()
    # fork_lock = Lock()
    # 互斥锁
    #
    #
    # def eat1(name):
    #     noodle_lock.acquire()
    #     print('%s拿到面条啦' % name)
    #     fork_lock.acquire()
    #     print('%s拿到叉子啦' % name)
    #     print('%s吃面' % name)
    #     fork_lock.release()
    #     noodle_lock.release()
    #
    #
    # def eat2(name):
    #     fork_lock.acquire()
    #     print('%s拿到叉子啦' % name)
    #     time.sleep(1)
    #     noodle_lock.acquire()
    #     print('%s拿到面条啦' % name)
    #     print('吃面')
    #     noodle_lock.release()
    #     fork_lock.release()
    #
    #
    # if __name__ == '__main__':
    #     Thread(target=eat1, args=('alex', )).start()
    #     Thread(target=eat2, args=('Egon',)).start()
    #     Thread(target=eat1, args=('bossJin',)).start()
    #     Thread(target=eat2, args=('zeZha',)).start()
    import time
    from threading import RLock, Thread
    
    
    fork_lock = noodle_lock = RLock()   # 一个钥匙串上的两把钥匙
    # 递归锁   为了解决死锁问题,可以acquire()多次,
    
    
    def eat1(name):
        noodle_lock.acquire()   # 一把钥匙
        print('%s拿到面条啦' % name)
        fork_lock.acquire()
        print('%s拿到叉子啦' % name)
        print('%s吃面' % name)
        fork_lock.release()
        noodle_lock.release()
    
    
    def eat2(name):
        fork_lock.acquire()
        print('%s拿到叉子啦' % name)
        time.sleep(1)
        noodle_lock.acquire()
        print('%s拿到面条啦' % name)
        print('%s吃面' % name)
        noodle_lock.release()
        fork_lock.release()
    
    
    if __name__ == '__main__':
        Thread(target=eat1, args=('alex', )).start()
        Thread(target=eat2, args=('Egon',)).start()
        Thread(target=eat1, args=('bossJin',)).start()
        Thread(target=eat2, args=('zeZha',)).start()

    4.条件和定时器

    # !/usr/bin/env python
    # !--*--coding:utf-8 --*--
    # !@Time    :2018/7/20 11:25
    # !@Author   TrueNewBee
    import time
    from threading import Semaphore, Thread
    
    
    def func(sem1, a, b):
        # 同一时间就让四个线程执行代码
        sem1.acquire()
        time.sleep(1)
        print(a+b)
        sem1.release()
    
    
    if __name__ == '__main__':
        sem = Semaphore(4)
        for i in range(10):
            t = Thread(target=func, args=(sem, i, i+5))
            t.start()

    5.事件

    # !/usr/bin/env python
    # !--*--coding:utf-8 --*--
    # !@Time    :2018/7/20 11:31
    # !@Author   TrueNewBee
    # 事件被创建的时候
    # False状态
    #       wait() 阻塞
    # True状态
    #       wait() 非阻塞
    # clear 设置状态为False
    # set   设置状态为True
    
    
    # 数据库- 文件夹
    # 文件夹里有好多excel表格
    #   1.能够更方便的对数据进行增删改查
    #   2.安全访问的机制
    
    
    # 伪代码 看现象:
    # 起两个线程
    # 第一个线程:连接数据库
    #   等待一个信号,告诉我我们之间的网络是通的
    #   连接数据库
    # 第二个线程:检测与数据库之间的网络情况是否连通
    #       time.sleep(0,2)
    #       将事件状态设置为True
    
    import time
    import random
    from threading import Thread, Event
    
    
    def connect_db(e1):
        count = 0
        while count < 3:
            # 连接三次
            e1.wait(0.5)  # 状态是False的时候,我只等待1s
            if e1.is_set() == True:
                print('连接成功')
                break
            else:
                count += 1
                print('第%s次连接失败' % count)
        else:
            # 连接三次都都没连上,主动抛出异常
            raise TimeoutError('数据库连接超时')
    
    
    def check_web(e2):
        time.sleep(random.randint(0, 3))
        e2.set()
    
    
    if __name__ == '__main__':
        e = Event()
        t1 = Thread(target=connect_db, args=(e, ))
        t2 = Thread(target=check_web, args=(e, ))
        t1.start()
        t2.start()
  • 相关阅读:
    RWCString 定义 memeroy leak
    打开eclipse报错
    Eclipse 增加php插件
    Shell 字符串的截取
    【转载】Shell判断字符串包含关系的几种方法
    Shell $? $* $@ 等含义
    Shell 获取指定行的内容
    概念性进程
    网络编程
    模块详解
  • 原文地址:https://www.cnblogs.com/zhen1996/p/9343119.html
Copyright © 2020-2023  润新知