Python多处理:以不同速度工作的子进程

时间:2016-08-25 16:36:21

标签: python python-multiprocessing

我是python multiprocessing的新手。我正在尝试使用third-party web-API来获取感兴趣的多个符号的数据。这是我的python代码:

<!-- language:lang-py-->

def my_worker(symbol, table_name):
    while True:
        # Real-time data for the symbol, third party code which is verified
        data = webApi.getData(symbol)
        query = ('insert into ' + table_name + '(var1, var2) values("%s, %s")' %(data[0], data[1]))
        # Execute query and store the data. Omitted for sake of brevity

if __name__ == "__main__":
    my_symbols = get_symbols_list() # List of symbols
    my_tables = get_tables_list()   # Corresponding list of mysql tables
    jobs = []
    for pidx in range(len(my_symbols)):
        pname = 'datarecorder_' + my_symbols[pidx]  # Naming the process for later identification
        p = multiprocessing.Process(name=pname, target=my_worker, args=(my_symbols[pidx], my_tables[pidx],))
        jobs.append(p)
        p.start()

此代码中约有50 processes created

我面临的问题: 是当我在一定时间(比如5分钟)后查看相应的表格时,每个表格中的记录数量在my_tables中是完全不同的(大约10的倍数)

由于我使用相同的API,相同的网络连接和相同的代码来获取和写入数据到mysql表,我不确定是什么原因造成了记录数量的这种差异。 My hunch is that each of the 50 processes is getting assigned an unequal amount of RAM and other resources, and perhaps the priority is also different(?)

有人能告诉我如何确保每个进程在webApi中大致相同的次数进行轮询?

1 个答案:

答案 0 :(得分:0)

处理此类事情的有效方法是从更简单的事情开始,然后添加内容直到&#34;问题&#34;出现。否则,它只是盲目的猜测。

例如,这里有一些更简单的东西,我在Windows下运行(就像你 - 我使用当前的Win10 Pro)和Python 3.5.2:

import multiprocessing as mp
from time import sleep

NPROCS = 50

def worker(i, d):
    while True:
        d[i] += 1
        sleep(1)

if __name__ == "__main__":
    d = mp.Manager().dict()
    for i in range(NPROCS):
        d[i] = 0

    ps = []
    for i in range(NPROCS):
        p = mp.Process(target=worker, args=(i, d))
        ps.append(p)
        p.start()

    while True:
        sleep(3)
        print(d.values())

这是大约一分钟的运行后的最新输出:

[67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
 67, 67, 67, 67, 67, 67, 67, 67, 67, 66,
 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
 66, 66, 66, 66, 66, 66, 66, 66, 66, 66]

所以我可以得出结论,没有什么&#34;本质上不公平&#34;关于此框的进程安排。在你的盒子上?运行它,看看; - )

我还可以在任务管理器中看到所有50个进程都被类似地处理,例如具有相同的RAM使用率和优先级。仅供参考,这个盒子恰好有8个逻辑核心(4个物理核心),并且RAM足够多(16GB)。

现在你所做的事情还有其他复杂问题,我们无法从这里猜到。例如,您可能正在耗尽RAM,因此页面文件交换会大大延迟某些进程。或者,你所做的工作可能比其他人要长得多。或者......但是,无论如何,最简单的方法是逐步使一个非常简单的程序变得更加迷人。