使用While循环进行Python多处理?

时间:2016-01-30 22:11:58

标签: python while-loop multiprocessing python-multiprocessing

我试图理解为什么第二个函数没有被调用,你是不是可以使用带有多处理的While循环?如果有人有任何建议,我将不胜感激!

import multiprocessing
import time

from multiprocessing import Pool

def func_ONE(data):
    while True:
        print 'Func ONE'
        print str(data)
        time.sleep(10)

def func_TWO(data):
    while True:
        print 'Func TWO'
        print str(data)
        time.sleep(10)

def worker(params):
    param1, param2 = params
    if param1:
        func_ONE(param1)
    if param2:
        func_TWO(param2)

data1 = 'bob'
data2 = 'joe'

if __name__ == '__main__':
    params = zip([data1], [data2])
    pool = multiprocessing.Pool()
    results = pool.map(worker, params)

2 个答案:

答案 0 :(得分:0)

import multiprocessing, Queue, time

class Worker(multiprocessing.Process):

    def __init__(self, work_queue):
        # base class initialization
        multiprocessing.Process.__init__(self)

        # job management stuff
        self.work_queue = work_queue
        self.kill_received = False

    def run(self):

        while not self.kill_received:

            # get a task
            try:
                n_job, data = self.work_queue.get_nowait()
            except Queue.Empty:
                break

            # the actual processing
            print "Starting %d ..." % n_job
            print str(data)
            time.sleep(10)


if __name__ == "__main__":

    data1 = 'bob'
    data2 = 'joe'

    work_queue = multiprocessing.Queue()
    for n, data in enumerate([data1, data2]):
        work_queue.put( (n, data) )

    num_processes = 2
    for i in range(num_processes):
        worker = Worker(work_queue)
        worker.start()

我想你想做的就是这样。

答案 1 :(得分:0)

如果您希望两个函数并行运行,则需要让它们从不同的worker调用而不是同一个函数运行。

根本不修改子进程代码,只需在主进程代码中以不同方式构造params即可:

params = [(data1, None), (None, data2)]

但我不确定这是否是最好的做事方式。如果在2元组中有多个非假名值作为worker与[{1}},map作为参数传递,那么可能map不是正确的用法。如果需要,您可以使用map在不同的工作进程中调用不同的函数:

apply_asyc

现在,您的工作人员永远不会返回,因此调用if __name__ == '__main__': pool = multiprocessing.Pool() results1 = pool.apply_async(func_ONE, (data1,)) results2 = pool.apply_async(func_TWO, (data2,)) 将永远阻止主进程,这可能并不理想(但这是一个更大的设计问题)。