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
  • 相关阅读:
    【Elasticsearch 技术分享】—— ES 常用名词及结构
    【Elasticsearch 技术分享】—— Elasticsearch ?倒排索引?这都是什么?
    除了读写锁,JUC 下面还有个 StampedLock!还不过来了解一下么?
    小伙伴想写个 IDEA 插件么?这些 API 了解一下!
    部署Microsoft.ReportViewe
    关于TFS强制undo他人check out
    几段查看数据库表占用硬盘空间的tsql
    How to perform validation on sumbit only
    TFS 2012 Disable Multiple Check-out
    在Chrome Console中加载jQuery
  • 原文地址:https://www.cnblogs.com/zrh-960906/p/11341753.html
Copyright © 2011-2022 走看看