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)
归档时间: |
|
查看次数: |
2342 次 |
最近记录: |