当前位置: 首页 > 面试题库 >

在多处理过程中保持统一计数?

南门飞
2023-03-14
问题内容

我有一个运行蒙特卡罗模拟的python程序,以找到概率问题的答案。我正在使用多重处理,这是伪代码

import multiprocessing

def runmycode(result_queue):
    print "Requested..."
    while 1==1:
       iterations +=1
    if "result found (for example)":
        result_queue.put("result!")

    print "Done"

processs = []
result_queue = multiprocessing.Queue()

for n in range(4): # start 4 processes
    process = multiprocessing.Process(target=runmycode, args=[result_queue])
    process.start()
    processs.append(process)

print "Waiting for result..."

result = result_queue.get() # wait

for process in processs: # then kill them all off
    process.terminate()

print "Got result:", result

我想扩展此范围,以便可以对已运行的迭代次数进行统一计数。就像线程1运行了100次,线程2运行了100次一样,我想显示总共200次迭代,作为控制台打印。我指的iterations是线程过程中的变量。如何确保所有线程都添加到同一变量?我认为使用的Global版本iterations会行得通,但行不通。


问题答案:

普通全局变量不像线程之间共享那样在进程之间共享。您需要使用流程感知的数据结构。对于您的用例,amultiprocessing.Value应该可以正常工作:

import multiprocessing

def runmycode(result_queue, iterations):
   print("Requested...")
   while 1==1: # This is an infinite loop, so I assume you want something else here
       with iterations.get_lock(): # Need a lock because incrementing isn't atomic
           iterations.value += 1
   if "result found (for example)":
       result_queue.put("result!")

   print("Done")


if __name__ == "__main__":
    processs = []
    result_queue = multiprocessing.Queue()

    iterations = multiprocessing.Value('i', 0)
    for n in range(4): # start 4 processes
        process = multiprocessing.Process(target=runmycode, args=(result_queue, iterations))
        process.start()
        processs.append(process)

    print("Waiting for result...")

    result = result_queue.get() # wait

    for process in processs: # then kill them all off
        process.terminate()

    print("Got result: {}".format(result))
    print("Total iterations {}".format(iterations.value))

一些注意事项:

  1. 我明确将传递Value给子代,以保持代码与Windows兼容,Windows无法在父代和子代之间共享读/写全局变量。
  2. 我用锁保护了增量,因为它不是原子操作,并且容易受到竞争条件的影响。
  3. if __name__ == "__main__":再次添加了一个保护措施,以帮助与Windows兼容,并作为一般的最佳实践。


 类似资料:
  • 6.1.4 查看统计信息 Mrds:6379> info 在cli下执行info。 info Replication 只看其中一部分。 config resetstat 重新统计。 # Server redis_version:2.8.19 ###redis版本号 redis_git_sha1:00000000 ###git SHA1 redis_git_dirty:0 ###git dir

  • 我有以下的要求要设计。 有多个作业要完成。每个作业都有一个作业id和一个系统id。作业id是唯一的,但同一系统id可能有多个作业 应顺序处理给定系统id的作业 其中某些作业可能处于等待状态,如果处于等待状态,则在x秒/分钟之前不应重新尝试返回 系统约束 唯一系统ID的数目可以是lakhs 每个系统ID的作业数可以是lakh 我曾考虑过使用kafka,但如果一个系统被阻塞,那么该分区中不同系统的所有

  • 问题内容: 我一直在处理我公司的CI扩展问题,同时试图弄清楚在CI和多个分支机构中采用哪种方法。在stackoverflow,多个功能分支和持续集成上也存在类似的问题。我开始了新的话题,因为我想进行更多的讨论并提供有关问题的一些分析。 到目前为止,我发现我可以采用2种主要方法(或者可能采取其他一些方法?)。 每个分支有多套工作(在这里谈论詹金斯/哈德森) 编写工具来管理额外的工作 批量创建/修改/

  • 法医专家通常发现很难应用数字解决方案来分析常见犯罪中的大量数字证据。 大多数数字调查工具都是单线程的,它们一次只能执行一个命令。 在本章中,我们将重点介绍Python的多处理功能,这些功能可以解决常见的取证挑战。 多处理器 Multiprocessing 多处理定义为计算机系统支持多个进程的能力。 支持多处理的操作系统使多个程序能够同时运行。 存在各种类型的多处理,例如symmetric和asym

  • 我想在整个camel路由中保持数据库连接。我已经在路由上定义了名为“stageDataSource”的数据源。如何在处理器“MyDBStageProcessor”中使用相同的数据源,或者更确切地说,使用相同的数据库连接? 我在MyDBStageProcencer中创建了一个新的连接并关闭了它。但是,它在Postgres中最大限度地耗尽了我的连接。因此,我想在整个路由中使用单个连接。 我可以从Exc