美文网首页
python 多线程

python 多线程

作者: y_7539 | 来源:发表于2018-12-09 11:33 被阅读0次

    多线程编程

    Thread方式

    # 导包
    import threading
    import time
    
    
    # 创建方法
    def work(msg):
        print(f"当前线程:{threading.current_thread().name}", msg)
        time.sleep(1)
    
    
    # 创建对象
    for i in range(10):
        t = threading.Thread(target=work, args=(i,))
        t.start()
    
    

    Thread类继承

    import threading
    
    
    # 创建一个类继承线程
    class NewThread(threading.Thread):
        def __init__(self, name):
            # 调用父类的init方法
            super(NewThread, self).__init__()
            self.name = name
    
    
        # run方法必须写
        def run(self):
            print(f"{self.name}好吃")
    
    
    for i in ["包子", "牛肉", "鸡肉"]:
        # 实例化对象
        t = NewThread(i)
        t.start()
    

    线程和进程

    线程:调度单元具体做事的那个人 共享内存空间 修改全局变量会影响 线程不安全 需要互斥锁

    进程:程序的代码,其他的一些资源 每增加一个进程就会创建一份内存空间 修改全局变量不会有影响 通信麻烦 需要用队列

    线程共享内存空间

    import threading
    
    num = 1
    
    
    def write():
        global num
        num += 1
        print(f"write里面的{num}")
    
    
    def read():
        global num
        num += 1
        print(f"read里面的{num}")
    
    
    # 实例化
    tw = threading.Thread(target=write)
    tr = threading.Thread(target=read)
    tw.start()
    tr.start()
    print("main里面的", num)
    
    

    线程安全

    import threading
    
    num = 0
    
    
    def write():
        global num
        for i in range(100000):
            num += 1
        print(f"write里面的{num}")
    
    
    def read():
        global num
        for i in range(100000):
            num += 1
        print(f"read里面的{num}")
    
    
    # 实例化
    tw = threading.Thread(target=write)
    tr = threading.Thread(target=read)
    tw.start()
    #tw.join()
    tr.start()
    #tr.join()
    print("main里面的", num)
    

    结果不等于200000

    个人看法:进程的join方法,线程里面同样有,这样出来的结果就是200000

    解决线程安全加互斥锁

    某个线程要更改共享数据时,先将其锁定,此时资源的状态为”锁定“,其他线程不能更改;直到该线程释放资源,将资源的状态变成”非锁定“,其他线程才能再次锁定该资源。互斥锁保证了多线程下数据的正确性

    import threading
    
    num = 0
    
    
    def write():
        global num
        #加锁
        l.acquire()
        for i in range(100000):
            num += 1
        #解锁
        l.release()
        print(f"write里面的{num}")
    
    
    def read():
        global num
        #加锁
        l.acquire()
        for i in range(100000):
            num += 1
        #解锁
        l.release()
        print(f"read里面的{num}")
    #创建一把锁
    l = threading.Lock()
    
    # 实例化
    tw = threading.Thread(target=write)
    tr = threading.Thread(target=read)
    tw.start()
    tr.start()
    
    

    死锁

    #coding=utf-8
    import threading
    import time
    
    class MyThread1(threading.Thread):
        def run(self):
            if mutexA.acquire():
                print(self.name+'----do1---up----')
                time.sleep(1)
    
                if mutexB.acquire():
                #if mutexB.acquire(timeout=2):
                    print(self.name+'----do1---down----')
                    mutexB.release()
                mutexA.release()
    
    class MyThread2(threading.Thread):
        def run(self):
            if mutexB.acquire():
                print(self.name+'----do2---up----')
                time.sleep(1)
                if mutexA.acquire():
                    print(self.name+'----do2---down----')
                    mutexA.release()
                mutexB.release()
    
    mutexA = threading.Lock()
    mutexB = threading.Lock()
    
    if __name__ == '__main__':
        t1 = MyThread1()
        t2 = MyThread2()
        t1.start()
        t2.start()
    

    解决:添加超时时间

    进程与线程

    进程:独立内存空间,资源分配的单元

    线程:共享内存空间 大大减少内存的使用 线程不安全 调试单元 最后做事的那个人

    一个程序至少一个进程,至少一个线程

    什么时候使用多进程,什么时候使用多线程

    IO密集型:多线程(输入 输出 多用于数据传输)

    CPU密集型:多进程(多用来做运算)

    相关文章

      网友评论

          本文标题:python 多线程

          本文链接:https://www.haomeiwen.com/subject/wwmhhqtx.html