Python多处理 – 将类方法应用于对象列表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python多处理 – 将类方法应用于对象列表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1747字,纯文字阅读大概需要3分钟。
内容图文
![Python多处理 – 将类方法应用于对象列表](/upload/InfoBanner/zyjiaocheng/702/f628e79758fd477783b6ceff524ec1cb.jpg)
有一种简单的方法可以使用多处理来完成相同的操作吗?
for sim in sim_list:
sim.run()
其中sim_list的元素是“模拟”对象,而run()是模拟类的一种方法,它修改对象的属性.例如.:
class simulation:
def __init__(self):
self.state['done']=False
self.cmd="program"
def run(self):
subprocess.call(self.cmd)
self.state['done']=True
sim_list中的所有sim都是独立的,因此策略不必是线程安全的.
我尝试了以下内容,这显然是有缺陷的,因为参数是通过deepcopy传递的,并且没有就地修改.
from multiprocessing import Process
for sim in sim_list:
b = Process(target=simulation.run, args=[sim])
b.start()
b.join()
解决方法:
实现您想要的一种方法是让您的计算类(在您的情况下模拟)成为Process的子类.正确初始化后,此类的实例将在单独的进程中运行,您可以根据需要从列表中设置一组实例.
这是一个例子,建立在你上面写的内容之上:
import multiprocessing
import os
import random
class simulation(multiprocessing.Process):
def __init__(self, name):
# must call this before anything else
multiprocessing.Process.__init__(self)
# then any other initialization
self.name = name
self.number = 0.0
sys.stdout.write('[%s] created: %f\n' % (self.name, self.number))
def run(self):
sys.stdout.write('[%s] running ... process id: %s\n'
% (self.name, os.getpid()))
self.number = random.uniform(0.0, 10.0)
sys.stdout.write('[%s] completed: %f\n' % (self.name, self.number))
然后只需创建一个对象列表并使用循环启动每个对象:
sim_list = []
sim_list.append(simulation('foo'))
sim_list.append(simulation('bar'))
for sim in sim_list:
sim.start()
运行时,您应该看到每个对象都在自己的进程中运行.不要忘记在类初始化之前调用Process .__ init __(self)作为第一件事.
显然我在这个例子中没有包含任何进程间通信;你必须补充一点,如果你的情况需要它(从你的问题中不清楚你是否需要它).
这种方法对我很有用,我不知道有什么缺点.如果有人知道我忽略了隐藏的危险,请告诉我.
我希望这有帮助.
内容总结
以上是互联网集市为您收集整理的Python多处理 – 将类方法应用于对象列表全部内容,希望文章能够帮你解决Python多处理 – 将类方法应用于对象列表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。