我是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中大致相同的次数进行轮询?
答案 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,因此页面文件交换会大大延迟某些进程。或者,你所做的工作可能比其他人要长得多。或者......但是,无论如何,最简单的方法是逐步使一个非常简单的程序变得更加迷人。