zoukankan      html  css  js  c++  java
  • 进程线程之间的通信

    多进程之间有各自的内存空间,多线程是共享同一个线程的空间

    多进程之间的通信

    from multiprocessing import Process, Manager
    
    
    def func(li):
        li.append(1)
    
    
    if __name__ == "__main__":
        mgr = Manager() #(共享内存)管理器接口
        # 代理
        shared_list = mgr.list() # 在公共进程Manage中开启一个list空间,用来进程通信
        # mgr.dict()
        # mgr.Queue()
        p = Process(target=func, args=(shared_list, ))
        p.start()
        p.join()
    
        print(shared_list)

    多线程之间的通信

    from threading import Thread
    
    
    a = []
    def fun(a):
        a.append(1)
    
    t = Thread(target=fun, args=(a, ))
    t.start()
    t.join()
    
    print(a)

    多线程大数据通信紊乱

    线程共享内存的竞争问题,a=0, t1 -> 0 + 1(尚未将结果复制给a, 切换线程至t2), t2 ->   此时a依然为 a=0, 执行0-1并复制给a=-1, 切回t1继续执行,复制给a=1。  

    """ 线程之间的通信 """
    from threading import Thread
    
    
    a = 0
    
    def incr(n):
        global a
        for i in range(n):
            a += 1
    
    def decr(n):
        global a
        for i in range(n):
            a -= 1
    
    
    t1 = Thread(target=incr, args=(100000, ))
    t2 = Thread(target=decr, args=(100000, ))
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print(a) # 数据大,结果不固定,不为0

    解决内存竞争问题,通过线程的互斥锁来控制(但是会增加性能消耗,尽量只在必要的地方加锁)

    # -*- coding: utf-8 -*-
    """ 线程之间的通信 """
    from threading import Thread, Lock
    
    
    lock = Lock()
    a = 0
    
    def incr(n):
        global a
        for i in range(n):
            lock.acquire() # 上锁
            a += 1
            lock.release() # 解锁
    
    def decr(n):
        global a
        for i in range(n):
            with lock: # 上锁,解锁
                a -= 1
    
    
    t1 = Thread(target=incr, args=(100000, ))
    t2 = Thread(target=decr, args=(100000, ))
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print(a) # 结果为0

    一进程与另一个进程中的线程通信,也是通过Manage先进行进程之间的通信。

    进程线程通信安全之队列(先进先出数据结构, 生产者消费者模式

     

  • 相关阅读:
    linux下tomcat内存溢出
    leetcode
    HDU 4810 Wall Painting (位操作-异或)
    详解Java中的访问控制修饰符(public, protected, default, private)
    mpvue开发微信小程序之时间+日期选择器
    多行文本溢出隐藏
    swift 多态函数方式
    swift 多态函数方式
    swift 多态函数方式
    swift 多态函数方式
  • 原文地址:https://www.cnblogs.com/tangpg/p/10630907.html
Copyright © 2011-2022 走看看