我不知道我是否正确理解多处理,但对于我需要的,它基本上是对服务器进行数千个小请求。为了简化这个问题,我开始做了一些测试,只是列出了一个任务列表,让它在列表中的每一项上计算一些小的东西。向服务器发出请求的问题在于,您不希望发送垃圾邮件或被列入黑名单。为此,我需要一个时机,它完全符合multiprocessing.Process()
。另一方面,每当我在多个1000进程中使用它时,它有时会崩溃,或者至少会崩溃所有其他正在运行的程序。为此,我需要一个进程池,mulitprocessing.Pool()
完全适合。
是我错过了什么,还是有一种方法可以让我两全其美?
下面是我正在尝试的一些示例代码:
import time
import multiprocessing
def foo(para):
# do something very lightweight
print(para*2)
parameters = [] # a long populated list of values, can be up to 100k processes long
# test Process
for para in parameters:
Process(target=foo, args=(para)).start()
time.sleep(0.06) # my rate limit in this case
# test Pool
with multiprocessing.Pool() as pool:
pool.starmap(target=foo, zip(parameters))
我面临的问题是,我要么被禁止请求,要么我的设备崩溃。任何帮助都将非常感激。请启发我,如果我错过了一些关于多处理。我是新手。
Pathos是一个很好的库,可以使用processingPool(processlimit)方法实现这一点(pip install Pathos)。下面是一个关于如何使用池的示例:
from pathos.multiprocessing import ProcessingPool as Pool
import time
start = time.perf_counter()
def function(arg):
arg = arg + 5
time.sleep(1)
return arg
def main():
argumentlist = [20, 136, 176, 228, 403, 433, 491, 543, 559, 575, 724, 760, 776, 792, 808, 860, 1035, 1051, 1067, 1083, 1177, 1193]
pool = Pool(4) #the argument here is the number of processes you limit your pool to
results = pool.map(function, argumentlist)
for result in results:
print(result)
return results
if __name__ == '__main__':
main()
end = time.perf_counter()
print(f"Finished in {round(end-start, 2)} second(s)")
这是关于限制一次运行的进程数量。但是在你的情况下,你必须检查你正在使用的api授权的最大请求数/小时,在该限制之前创建一个中断,并在一段时间后继续。
如果检索所请求的信息需要花费很多时间,那么多处理不是正确的选择。你需要使用多线程。
这是教我如何使用多线程的教程。我想你能从中学到你想知道的东西。
https://www.youtube.com/watch?v=IEEhzQoKtQU