6 python multithreading multiprocessing
我有一个关于Python多处理的问题。我正在尝试获取数据集,分成多个块,然后将这些块传递给并发运行的进程。我需要使用简单的计算方法来转换大型数据表(例如,电阻->热敏电阻的温度)。
下面列出的代码几乎可以按需工作,但是它似乎并没有产生任何新的进程(或者一次只有一个)。我是Python的新手,所以可能有一个解决此问题的简单方法。
提前致谢!
从多处理导入过程
工人(过程)类:
#数据转换示例
def进程(self,x):返回(x * 2)/ 3
def __init __(自己,列表):
self.data =列表
self.result =地图(self.process,self.data)
超级(工人,自我).__ init __()
如果__name__ =='__main__':
开始= datetime.datetime.now()
数据集= range(10000)#空数据集
流程= 3
对于我在范围内(过程):
块= int(math.floor(len(数据集)/ float(进程)))
如果i + 1 ==处理:
余数= len(数据集)%处理
否则:余数= 0
tmp =数据集[i *块:(i +1)*块+余数]
exec('worker'+ str(i)+'= Worker(tmp)')
exec('worker'+ str(i)+'。start()')
对于我在范围内(过程):
exec('worker'+ str(i)+'。join()')
#只是一个占位符,以确保集合的初始值符合预期
exec('print worker'+ str(i)+'。result [0]')
小智 1
无需向每个进程发送块的数量,只需使用 get_nowait() 并处理最终的 Queue.Empty 异常。每个进程都会获得不同数量的 CPU 时间,这会让它们都忙碌起来。
import multiprocessing, Queue
class Worker(multiprocessing.Process):
def process(self, x):
for i in range(15):
x += (float(i) / 2.6)
return x
def __init__(self, input, output):
self.input = input
self.output = output
super(Worker, self).__init__()
def run(self):
try:
while True:
self.output.put(self.process(self.input.get_nowait()))
except Queue.Empty:
pass
if name == 'main':
dataset = range(10)
processes = multiprocessing.cpu_count()
input = multiprocessing.Queue()
output = multiprocessing.Queue()
for obj in dataset:
input.put(obj)
for i in range(processes):
Worker(input, output).start()
for i in range(len(dataset)):
print output.get()
Run Code Online (Sandbox Code Playgroud)