首页 > 系统相关 >python多进程,通过内存共享来通信,使用进程锁来防止数据问题

python多进程,通过内存共享来通信,使用进程锁来防止数据问题

时间:2024-12-25 20:42:43浏览次数:4  
标签:__ 锁来 python list print 进程 shared 共享 multiprocessing

代码:

import multiprocessing
import time
    
    
'''
使用锁和multiprocessing.Value,multiprocessing.Array,multiprocessing.Manager().list
'''
def worker1(shared_number1, lock):
    for _ in range(10):
        with lock:
            shared_number1.value += 1
    
def worker2(shared_array1, lock):
    for i in range(len(shared_array1)):
        with lock:
            shared_array1[i] += 1

'''
不使用锁
'''
shared_number2 = 0
shared_array2 = [0,1,2,3,4,5,6,7,8,9]

def worker11():
    global shared_number2
    for _ in range(10):
        shared_number2 += 1
    time.sleep(1)
    
def worker22():
    global shared_array2
    for i in range(len(shared_array2)):
        shared_array2[i] += 1
    
    time.sleep(1)

if __name__ == '__main__':
    shared_number1 = multiprocessing.Value('i', 0)
    shared_array1 = multiprocessing.Array('i', [0,1,2,3,4,5,6,7,8,9])
    lock1 = multiprocessing.Lock()
    lock2 = multiprocessing.Lock()
    
    processes1 = []
    for _ in range(100):
        p = multiprocessing.Process(target=worker1, args=(shared_number1, lock1))
        processes1.append(p)
        p.start()
    
    processes2 = []
    for _ in range(100):
        p = multiprocessing.Process(target=worker2, args=(shared_array1, lock2))
        processes2.append(p)
        p.start()
    
    for p in processes1:
        p.join()
    
    for p in processes2:
        p.join()
    
    
    print('使用锁的情况下:')
    print(f"最终的共享数字是: {shared_number1.value}")
    print(shared_array1[:])
    print()
    
    processes11 = []
    for _ in range(100):
        p = multiprocessing.Process(target=worker11, args=())
        processes11.append(p)
        p.start()
    
    processes22 = []
    for _ in range(100):
        p = multiprocessing.Process(target=worker22, args=())
        processes22.append(p)
        p.start()
    
    for p in processes11:
        p.join()
    
    for p in processes22:
        p.join()
    
    #time.sleep(5)
    
    
    print('不使用锁的情况下:')
    print(f"最终的共享数字是: {shared_number2}")
    print(shared_array2[:])

 

import multiprocessing

def calculate_squares(numbers, shared_list):
    for n in numbers:
        shared_list.append(n * n)

def calculate_cubes(numbers, cube_list):
    for n in numbers:
        cube_list.append(n * n * n)

if __name__ == "__main__":
    # 创建Manager对象
    manager = multiprocessing.Manager()
    square_list = manager.list()  # 共享平方列表
    cube_list = manager.list()     # 共享立方列表

    numbers = [1, 2, 3, 4, 5]

    # 创建进程,启动进程
    process1 = multiprocessing.Process(target=calculate_squares, args=(numbers, square_list))
    process2 = multiprocessing.Process(target=calculate_cubes, args=(numbers, cube_list))
    
    process1.start()
    process1.join()  # 等待进程结束

    process2.start()
    process2.join()  # 等待进程结束

    print("共享平方结果:", list(square_list))
    print("共享立方结果:", list(cube_list))

 

输出:

使用锁的情况下:
最终的共享数字是: 1000
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109]

不使用锁的情况下:
最终的共享数字是: 0
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

共享平方结果: [1, 4, 9, 16, 25]
共享立方结果: [1, 8, 27, 64, 125]

 

标签:__,锁来,python,list,print,进程,shared,共享,multiprocessing
From: https://www.cnblogs.com/xuxiaobo/p/18631371

相关文章

  • python多进程之间通讯,消息队列Queue
    代码:frommultiprocessingimportProcess,Queuedefproducer(q):myinfo="包子"q.put(myinfo)print(f"生产了{myinfo}")myinfo="饺子"q.put(myinfo)print(f"生产了{myinfo}\n")''......
  • Python 中的文件处理
    Python中的文件处理Python中的文件处理文件操作打开和关闭文件读写文件使用上下文管理器(ContextManager)在多个文件上操作Python中的文件处理从文件读取数据或向文件写入数据是任何编程语言支持的基本操作之一。Python为处理文件操作提供了广泛的支持,这些操作大......
  • python毕设 外卖系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景关于外卖系统的研究,现有研究主要以成熟商业外卖平台的商业模式、市场推广等为主 1。专门针对使用Python进行毕设中的外卖系统开发的研究......
  • python多进程,使用pipe进行进程间的通讯
    importmultiprocessingimporttime'''python多进程pipe在多进程中,进程间的通信是一个常见的需求。管道(Pipe)提供了一种简单有效的进程间通信方式,允许数据在进程间传递。通过使用管道,我们可以让一个进程发送数据,另一个进程接收。以下是一个使用管道在两个进程之间传递......
  • C#使用Python.NET执行Python脚本文件踩坑总结
    在VS,Nuget包管理器搜索“Python.NET”,安装pythonnet包,如下图:C#使用Python.NET执行Python脚本文件,C#代码如下:1publicclassPythonExecuter2{3privatereadonlystring_pythonDllPath;4privatereadonlystring_workDir;56publicPythonExecute......
  • Python项目依赖管理
    做好Python环境的包版本管理对于确保项目的稳定性、可重复性和可维护性至关重要。以下是我平时采取的一些方法,期望对读者有所帮助:1.使用虚拟环境虚拟环境是实现包版本管理的重要基础,它可以隔离不同项目的运行环境,避免包版本冲突。我平时主要使用conda来管理虚拟环境。先在测试......
  • python版本的Selenium的下载及chrome环境搭建和简单使用
    针对Python版本的Selenium下载及Chrome环境搭建和使用,以下将详细阐述具体步骤:一、Python版本的Selenium下载安装Python环境:确保系统上已经安装了Python3.8及以上版本。可以从[Python官方网站]下载并安装最新版本的Python,当然您也可以使用anaconda3进行安装python环境。......
  • 基于Python大数据的电影可视化分析系统
    标题:基于Python大数据的电影可视化分析系统内容:1.摘要本文介绍了一个基于Python大数据的电影可视化分析系统。该系统通过收集和分析大量电影数据,提供了对电影市场的深入洞察。文章首先介绍了系统的背景和目的,然后详细描述了系统的架构和功能。接着,文章介绍了系统的实现......
  • 【圣诞节专属】python编写高级的圣诞树!太好看了!
    文章目录python圣诞代码(普通)python圣诞代码(高级)python圣诞代码(普通)当然,我可以为你提供一个简单的Python代码,它会在控制台中打印一个圣诞树的图案。这是一个基础的例子,你可以根据需要进一步美化和扩展。defprint_christmas_tree(height):#打印圣诞树的顶部......
  • Python和MySQL常用时间格式化异同
    Python和MySQL常用时间格式化异同1.Python时间格式化Python的datetime和time模块有一些常用的格式化形式,具体如下。%Y:四位数的年份,如2023。%m:两位数的月份(01-12)。%d:两位数的日期(01-31)。%H:24小时制的小时数(00-23)。%M:分钟数(00-59)。%S:秒数(00-59)。例如,"%Y-%m-%d"会将时......