Python 2.7 这段并行任务代码在Python中是如何工作的?

Python 2.7 这段并行任务代码在Python中是如何工作的?,python-2.7,parallel-processing,Python 2.7,Parallel Processing,我一直在使用一个脚本(上面)在一个有16个处理器的Ubuntu服务器上并行运行一些任务,它实际上可以工作,但我有一些问题: 代码实际上在做什么 随着工作人员的增多,我设置的脚本运行得更快,但是工作人员的限制是什么?我已经运行了100个 如何改进它 #!/usr/bin/env python from multiprocessing import Process, Queue from executable import run_model from database import DB imp

我一直在使用一个脚本(上面)在一个有16个处理器的Ubuntu服务器上并行运行一些任务,它实际上可以工作,但我有一些问题:

  • 代码实际上在做什么
  • 随着工作人员的增多,我设置的脚本运行得更快,但是工作人员的限制是什么?我已经运行了100个
  • 如何改进它

    #!/usr/bin/env python
    from multiprocessing import Process, Queue
    from executable import run_model
    from database import DB
    import numpy as np
    
    def worker(work_queue, db_conection):
        try:
            for phone in iter(work_queue.get, 'STOP'):
                registers_per_number = retrieve_CDRs(phone, db_conection)
                run_model(np.array(registers_per_number), db_conection)
                #print("The phone %s was already run" % (phone))
    
        except Exception:
            pass
    
        return True
    
    
    def retrieve_CDRs(phone, db_conection):
        return db_conection.retrieve_data_by_person(phone)
    
    
    def main():
        phone_numbers = np.genfromtxt("../listado.csv", dtype="int")[:2000]
    
        workers = 16
        work_queue = Queue()
        processes = []
        #print("Process started with %s" % (workers))
    
        for phone in phone_numbers:
            work_queue.put(phone)
            #print("Phone %s put at the queue" % (phone))
        #print("The queue %s" % (work_queue))
    
        for w in xrange(workers):
            #print("The worker %s" % (w))
            # new conection to data base
            db_conection = DB()
            p = Process(target=worker, args=(work_queue, db_conection))
    
            p.start()
            #print("Process %s started" % (p))
            processes.append(p)
            work_queue.put('STOP')
    
        for p in processes:
            p.join()
    
    
    if __name__ == '__main__':
        main()
    
    干杯


首先,从主要功能开始:

  • 它正在从CSV文件中创建一个包含2000个整数类型电话号码的numpy数组
  • 然后创建一些变量和列表
  • 接下来,您将创建一个包含从CSV文件中提取的所有电话号码的队列
  • 接下来,对于16个工作进程,您将为每个工作进程创建一个DB连接,设置处理参数并启动所有工作进程处理器的进程
  • 希望这能帮助你理解代码。实际上,您正在尝试的是一种多线程,其行为类似于并行处理。所以,你使用的数字越多,速度就越快。按照我的常识,你应该能够使用2000个处理器。从那以后,它就没有主从哲学的意义了。此外,并行处理建议您尽量减少空闲处理器/工作线程的数量。如果您有超过2000名员工,那么您将有一些空闲的员工,这将降低您的绩效。最后,改进并行处理需要改进这种思想

    希望有帮助。干杯