不同进程数据交流问题
全局变量,可以在同一进程(同一cpu)的任何一个函数中使用,但不同cpu中的数据是不能交互的,想要交互需要使用共享内存,如下图中2MB的L3级缓存
**程序锁使用的原因:**对于共享内存中的数据,每个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对缓存中的数据进行一次性读取显示。
针对数据未达到预期的情况,除了使用视频中提到的程序锁,感觉更像资源锁,个人对进程进行了延迟启动,在p1.start()之后添加一个延时,发现也是能够达到数据分开操作的情况。感觉浪费了多进程加速运算的优势。但说明了这是由于计算机程序抢夺资源的问题。
分为不同的任务
在执行过程中,发现每一个进程的数据是一下全部显示出来的,说明上面的猜想正确,将计算好的数据读取,然后显示,这样就是看那个进程先执行显示命令了。由于显示的数据比较多,但结果是进程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)
为了测试一下是不是多个计算结果一起读取
将计算的数据增加到10000,发现进程的第500个数据左右,会输出另外一个进程的数据。(电脑的内存不同,可能不同),最好使用相同的延迟时间,如果延迟时间是另一个进程的2倍,会连续输出同一个进程的内容