簡體   English   中英

在python中的並行進程中運行類方法

[英]Run a class method in parallel processes in python

我正在嘗試並且未能並行運行一個巨大的循環。 循環恰好是特定類的一種方法,在循環內部我稱之為另一種方法。 它確實可以工作,但是由於某種原因,列表中只有一個進程,並且輸出(請參見代碼)始終為“ Worker 0”。 要么未創建進程,要么進程未並行運行。 結構如下:

main.py

from my_class.py import MyClass

def main():
    class_object = MyClass()
    class_object.method()

if __name__ == '__main__':
    main()

my_class.py

from multiprocessing import Process

MyClass(object):
    def __init__(self):
        # do something

    def _method(self, worker_num, n_workers, amount, job, data):
        for i, val in enumerate(job):
            print('Worker %d' % worker_num)
            self.another_method(val, data)

    def another_method(self):
        # do something to the data

    def method(self):
        # definitions of data and job_size go here

        n_workers = 16
        chunk = job_size // n_workers
        resid = job_size - chunk * n_workers

        workers = []
        for worker_num in range(n_workers):
            st = worker_num * chunk
            amount = chunk if worker_num != n_workers - 1 else chunk + resid
            worker = Process(target=self._method, args=[worker_num, n_workers, amount, job[st:st+amount], data])
            worker.start()
            workers.append(worker)

        for worker in workers:
            worker.join()

        return data

我已經閱讀了一些有關需要主模塊可導入的子進程的信息,但是我不知道該如何做。

問題 :...但是仍然只使用一個內核。 所以問題是,我可以將多個核與Process對象一起使用

這並不取決於Python解釋器哪個Process使用哪個CPU。
相關: 在什么CPU核心是我的Python進程運行

用以下內容擴展def _method(... ,以查看實際發生的情況:

注意getpidcore(pid)分發的依賴項,可能會失敗

def getpidcore(pid):
    with open('/proc/{}/stat'.format(pid), 'rb') as fh:
        core = int(fh.read().split()[-14])
        return core

class MyClass(object): 
    ...
    def _method(self, worker_num, n_workers, amount, job, data):
        for i, val in enumerate(job):
            core = getpidcore(os.getpid())
            print('core:{} pid:{} Worker({})'.format(core, os.getpid(), (worker_num, n_workers, amount, job)))

輸出

 core:1 pid:7623 Worker((0, 16, 1, [1])) core:1 pid:7625 Worker((2, 16, 1, [3])) core:0 pid:7624 Worker((1, 16, 1, [2])) core:1 pid:7626 Worker((3, 16, 1, [4])) core:1 pid:7628 Worker((5, 16, 1, [6])) core:0 pid:7627 Worker((4, 16, 1, [5])) 

經過Python測試:Linux上為3.4.2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM