zoukankan      html  css  js  c++  java
  • 线程

    进程间通信

    from multiprocessing import Queue
    q = Queue(5)  # 括号内传的参数表示的是这个队列最大存存储数
    q.put(1)  #往队列里添加数据
    q.put(2)
    print(q.full())  # 判断队列是否满了
    q.put(3)
    q.put(4)
    q.put(5)
    print(q.full())
    # q.put(6) # 当队列满了,在放入数据不会报错,会原地等待,直到队列中的数据被取出
    print(q.get())  # 从对列中取数据
    print(q.get())
    print(q.get())
    print(q.empty())  # 判断数据队列是否取完
    print(q.get())
    print(q.get())
    print(q.empty())
    print(q.get_nowait())  #取值,如果没有直接报错
    # print(q.get())  # 当队列中没有数据,程序阻塞,直到队列中有数据

    进程间通信IPC机制

    from multiprocessing import Process,Queue
    def producer(q):
        q.put('hello')
    def consumer(q):
        print(q.get())
    if __name__ == '__main__':
        q = Queue()
        p = Process(target=producer,args=(q,))
        p1 = Process(target=consumer,args=(q,))
        p.start()
        p1.start()

    生产者消费者模型

      JoinableQueue 能够被join的q,    q.task_done()  告诉队列数据被取出    q.join()  等待队列数据完全被取完

    from multiprocessing import Process,JoinableQueue
    import random
    import time
    def producer(name,food,q):
        for i in range(10):
            data = '%s生产了%s%s'%(name,food,i)
            time.sleep(random.random())
            q.put(data)
            print(data)
    def consumer(name,q):
        while True:
            data = q.get()
            print('%s吃了%s'%(name,data))
            time.sleep(random.random())
            q.task_done()   #告诉队列从中取出一个数据,并且处理完毕了
    if __name__ == '__main__':
        q = JoinableQueue()
        p = Process(target=producer,args=('egon','馒头',q))
        p1 = Process(target=producer,args=('tank','生蚝',q))
        p2 = Process(target=consumer,args=('jason',q))
        p3 = Process(target=consumer,args=('alex',q))
        p.start()
        p1.start()
        p2.daemon = True
        p3.daemon = True
        p2.start()
        p3.start()
        p.join()
        p1.join()
        q.join()   # 等到队列中数据全部取出

    什么是线程
        进程线程其实都是虚拟单位,都是用来帮助我们形象的描述某种事物

      进程:资源单位
           线程:执行单位

        将内存比如成工厂  那么进程就相当于是工厂里面的车间   而你的线程就相当于是车间里面的流水线
        ps:每个进程都自带一个线程,线程才是真正的执行单位,进程只是在线程运行过程中
        提供代码运行所需要的资源

    为什么要有线程
        开进程
            1.申请内存空间  耗资源
            2."拷贝代码"    耗资源

     开线程
          一个进程内可以起多个线程,并且线程与线程之间数据是共享的
            ps:开启线程的开销要远远小于开启进程的开销

    创建线程的两种方式

    方式一
    from threading import Thread
    import time
    def tast(name):
        print('%s'%name)
        time.sleep(1)
        print('gun')
    t = Thread(target=tast,args=('egon',))  # 开线程不需要在__main__代码块内 但是习惯性的还是写在__main__代码块内
    t.start()  # 告诉操作系统开辟一个线程  线程的开销远远小于进程,小的代码执行完 线程就已经开启了
    print('hi')
    
    方式二
    from threading import Thread
    import time
    class MyThread(Thread):
        def __init__(self,name):
            super().__init__()
            self.name = name
        def run(self):
            print('%s'%self.name)
            time.sleep(1)
            print('gun')
    t = MyThread('egon')
    t.start()
    print('hi')

    线程对象及其它方法

    from threading import Thread,current_thread,active_count
    import  time
    import os
    def test(name,i):
        print('%s'%name)
        print('',current_thread().name)
        print('',os.getpid())
        time.sleep(i)
        print('hi')
    t = Thread(target=test,args=('egon',1))
    t1 = Thread(target=test,args=('tank',2))
    t.start()
    t1.start()
    t.join()
    print('进程数',active_count())
    print('')
    print('',current_thread().name)
    print('',os.getpid())

    守护线程

    from threading import Thread,current_thread
    import time
    def test(i):
        print(current_thread().name)
        time.sleep(i)
        print('gg')
    for i in range(3):
        t = Thread(target=test,args=('i'),)
        t.daemon = True
        t.start()
        print('')

    线程间通信

    from threading import Thread
    money = 100
    def test():
        global money
        money = 999
    t = Thread(target=test)
    t.start()
    t.join()
    print(money)

    互斥锁

    
    
    from threading import Thread,Lock
    import time
    n = 100
    def test(mutex):
        global n
       tmp = n mutex.acquire() n = tmp - 1 mutex.release() mutex = Lock() l_list = [] for i in range(10): t = Thread(target=test,args=(mutex,)) t.start() l_list.append(t) for t in l_list: t.join() print(n)
     
    dayehui
  • 相关阅读:
    设计模式:备忘录模式(Memento)
    设计模式:中介者模式(Mediator)
    设计模式:迭代器模式(Iterator)
    设计模式:解释器模式(Interpreter)
    设计模式:命令模式(Command)
    设计模式:职责链模式(Chain of Responsibility)
    设计模式:单例模式(单例模式)
    win7硬盘安装方法
    sqlite 附加和分离数据库
    Sqlite 复制表结构和数据
  • 原文地址:https://www.cnblogs.com/zrh-960906/p/11341753.html
Copyright © 2011-2022 走看看