[英]Python Multiprocessing: Child processes working at different speed
我是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
了50 processes created
。
我面临的问题 是:当经过一定时间(例如5分钟)查看相应的表时,my_tables中每个表中的记录数完全不同(约为10s的倍数) )
由于我使用相同的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的次数大致相等吗?
解决这类问题的有效方法是从简单得多的事情开始,然后向其中添加内容,直到出现“问题”为止。 否则,这只是盲目的猜测。
例如,这要简单得多,我正在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]
因此,我可以得出结论,此框上的流程调度没有“本来就是不公平的”。 在你的盒子上? 运行它并查看;-)
我还可以在任务管理器中看到,对所有50个进程都进行了类似的处理,例如(相同)的RAM使用和优先级。 仅供参考,这个盒子恰好有8个逻辑核心(4个物理核心),并且远远超过了足够的RAM(16GB)。
现在,您正在做的事情还有很多其他复杂性,我们无法从这里猜到。 例如,也许您的内存不足,因此某些过程会因页面文件交换而大大延迟。 或者,您正在做的工作中某些论点花费的时间比其他论点花费的时间更长。 或...但是,不管怎么说,最简单的找出方法是一次使一个非常简单的程序逐渐变得更有趣。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.