美文网首页
python中进程,线程和协程

python中进程,线程和协程

作者: Challis | 来源:发表于2018-11-28 19:25 被阅读0次

    进程:资源分配的最小单位
    线程:任务分配的最小单位
    协程:用户模式下轻量级的线程,系统不管这部分的调度

    多进程

    from multiprocessing import Process
    import os
    
    def run(desc):
        while True:
            print('子进程{}开始'.format(os.getpid())
    
    
    if __name__ == "__main__":
        p = Process(target=run, args=('测试',))
        p.start()
        p.join(timeout=3) # join会阻塞当前进程,直到p进程执行结束之后才会继续执行, timeout是等待时间
        
        while True:
            print('这是主进程', os.getpid())
    
    # p.daemon 设置守护进程,主进程消失,子进程也消失
    
    
    

    全局变量在多个进程之间不会共享

    解决变量多线程不能共享问题

    # 使用队列在进程之间共享数据
    from multiprocessing import Process, Queue
    import queue
    # 往队列中写入数据
    def write(q):
        print('写进程开始')
        for i in 'abcdefg':
            try:
                q.put(i)
                print('{}已经被写入'.format(i))
            except queue.Full:
                print('队列已经满了')
    
    # 从队列中读取数据
    def read(q):
        print('读进程开始')
        while True:
            try:
                value = q.get(block=False) # block表示队列空的时候读取会报错
            except queue.Empty:
                print('队列是空的')
    
    if __name__ == "__main__":
        pw = Process(target=write,args=(q,))
        pr = Process(target=read, args=(q,))
        pw.start()
        pr.start()
    
    

    使用线程锁来解决多线程数据共享造成紊乱问题

    from threading import Thread, Lock
    num = 100
    def run(n):
        global num
        with Lock()  # 加上锁,保证了数字不会紊乱
            for i in range(1000):
                num += n
                num -= n
        return num
    
    
    if __name__ = "__main__":
        t1 = Thread(target=run, args=(3,))
        t2 = Thread(targe=run, args=(10,))
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        
    

    使用多线程实现生产者消费者模型

    import threading
    import time
    import random
    from queue import Queue
    
    
    cond = threading.condition()
    # 生产者
    def producer(q):
        cond.acquire()
        while True:
            value = random.randint(1,100)
            print('{}已经入队列'.format(value))
            try:
                q.put(value,block=False)
            except queue.Full
                print('队列已经满了')
    
    # 消费者
    def consumer(q):
        cond.acquire()
        while True:
            try:
                value = q.get(block=False)
                print('{}已经出队列'.format(value))
            except queue.Empty:
                print('队列已经空了')
    
    if __name__ == "__main__":
        q = Queue(10)
        t1 = threading.Thread(target=producer,q)
        t2 = threading.Thread(target=consumer,q)
        t1.start()
        t2.start()
        t1.join()
        t2.join()
    
    

    相关文章

      网友评论

          本文标题:python中进程,线程和协程

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