不同进程数据交流问题

全局变量,可以在同一进程(同一cpu)的任何一个函数中使用,但不同cpu中的数据是不能交互的,想要交互需要使用共享内存,如下图中2MB的L3级缓存

cpu共享权重设置多少_ico


**程序锁使用的原因:**对于共享内存中的数据,每个cpu都可以取调用,因此可能在使用中被程序之间因使用出现的混乱

import multiprocessing as mp
import time

# def job(v, num, l):


def job(v, num, pro_num):
    # l.acquire()
    for _ in range(5):
        time.sleep(0.1)
        v.value += num
        print("pro_num:",pro_num,v.value)
    # l.release()


def multicore():
    # l = mp.Lock()
    v = mp.Value('i', 0)
    p1 = mp.Process(target=job, args=(v, 1,1))
    p2 = mp.Process(target=job, args=(v, 3, 2))
    p1.start()
    #time.sleep(2)
    p2.start()
    p1.join()
    p2.join()


if __name__ == '__main__':
    multicore()

下面的结果可以看出,每次数据都加了4,可以认为,两个进程同时对数据进行了更改,数据都先保存到了cpu的缓存,不知道是计算机的线程调度问题还是别的,没有出现参考视频中的两个数据相同的情况,感觉像是两个cpu的计算比较同步,一个cpu将计算好的数据读取到一个cpu的缓存中,但在计算完成和读取的很短时间内,另一个cpu对数据进行了操作。因此每次读取的时候都是进行了两次计算。然后cpu对缓存中的数据进行一次性读取显示。

cpu共享权重设置多少_数据_02


针对数据未达到预期的情况,除了使用视频中提到的程序锁,感觉更像资源锁,个人对进程进行了延迟启动,在p1.start()之后添加一个延时,发现也是能够达到数据分开操作的情况。感觉浪费了多进程加速运算的优势。但说明了这是由于计算机程序抢夺资源的问题。

cpu共享权重设置多少_ico_03

分为不同的任务

在执行过程中,发现每一个进程的数据是一下全部显示出来的,说明上面的猜想正确,将计算好的数据读取,然后显示,这样就是看那个进程先执行显示命令了。由于显示的数据比较多,但结果是进程2的数据先显示,因为完成计算的进程1的延时时间比较长。

import multiprocessing as mp
import time

# def job(v, num, l):


def job(v, num, pro_num):
    # l.acquire()
    for _ in range(100):
        time.sleep(0.3)
        v.value += num
        print("pro_num:", pro_num, v.value)
    # l.release()


def job1(v, num, pro_num):
    for _ in range(100):
        time.sleep(0.1)
        v.value += num
        print("pro_num:", pro_num, v.value)


def multicore():
    # l = mp.Lock()
    v = mp.Value('i', 0)
    p1 = mp.Process(target=job, args=(v, 1, 1))
    p2 = mp.Process(target=job1, args=(v, 3, 2))
    p1.start()
    # time.sleep(2)
    p2.start()
    p1.join()
    p2.join()


if __name__ == '__main__':
    multicore()

从图中可以看出,每3次进行了一次加4的操作,这个应该是和延迟时间有关(0.3和0.1)

cpu共享权重设置多少_cpu共享权重设置多少_04

为了测试一下是不是多个计算结果一起读取

将计算的数据增加到10000,发现进程的第500个数据左右,会输出另外一个进程的数据。(电脑的内存不同,可能不同),最好使用相同的延迟时间,如果延迟时间是另一个进程的2倍,会连续输出同一个进程的内容