Python : 如何同时执行 100 个进程?

Python : How could I execute 100 process simultaneously?

我想达到的目标:

我想同时运行 100 个进程,因为当我将它作为for 循环执行时需要太多时间。例如:使用 for 循环,我的函数将等到发送第一个请求后发送第二个请求。但是我想要同时发送100个请求。

实际结果:

我的函数没有同时执行进程。它一个一个地执行。

预期结果:

我的尝试:所以我尝试 运行 100 个进程与多处理模块同时进行,但它没有按预期进行。当我尝试在我的代码中实现多处理模块时,它具有 运行 与没有多处理的版本相同的方式 运行 逐个处理。

我可能会漏掉一些东西。

这是我之前使用的代码。

没有多处理的版本 :

import openpyxl
import requests

def getRowCount(file,sheetName):
   workbook = openpyxl.load_workbook(file)
   sheet = workbook.get_sheet_by_name(sheetname)
   return(sheet.max_row)

def readData(file,sheetName,rownum,columno):
   workbook = openpyxl.load_workbook(file)
   sheet = workbook.get_sheet_by_name(sheetName)
   return sheet.cell(row=rownum, column=columno).value

path = my_excel_file
sheetname = my_sheetname
rows = getRowCount(path,sheetname)

def funct():
   for i in range(2, 100):
      name = readData(path,sheetname,i,1)
      data = "name":{}.format(name)
      s = requests.Session()
      session = s.post(url,headers=s.headers,data=data)

if __name__ == "__main__":
    funct()

这是我用来解决问题的代码。

多处理版本 :

import openpyxl
import requests
from multiprocessing import Process,Lock

def getRowCount(file,sheetName):
   workbook = openpyxl.load_workbook(file)
   sheet = workbook.get_sheet_by_name(sheetname)
   return(sheet.max_row)

def readData(file,sheetName,rownum,columno):
   workbook = openpyxl.load_workbook(file)
   sheet = workbook.get_sheet_by_name(sheetName)
   return sheet.cell(row=rownum, column=columno).value

path = my_excel_file
sheetname = my_sheetname
rows = getRowCount(path,sheetname)

def thread.task(lock,i):
    lock.acquire()
    name = readData(path,sheetname,i,1)
    data = "name":{}.format(name)
    s = requests.Session()
    session = s.post(url,headers=s.headers,data=data)
    lock.release()

if __name__ == '__main__':
    lock = Lock()
    processes = [Process(target=thread_task, args=(lock, i)) for i in range(2,100)]
    for process in processes:
        process.start()
    for process in processes:
        process.join()

我怎样才能同时执行所有进程?

如果有比多处理更好的解决方案来实现我想要的,请告诉我。

更新

我现在可以 运行 我的进程同时进行。

更新多处理版本 :

import openpyxl
import requests
from multiprocessing import Process,Lock

def getRowCount(file,sheetName):
   workbook = openpyxl.load_workbook(file)
   sheet = workbook.get_sheet_by_name(sheetname)
   return(sheet.max_row)

def readData(file,sheetName,rownum,columno):
   workbook = openpyxl.load_workbook(file)
   sheet = workbook.get_sheet_by_name(sheetName)
   return sheet.cell(row=rownum, column=columno).value

path = my_excel_file
sheetname = my_sheetname
rows = getRowCount(path,sheetname)

def thread.task(i):
    name = readData(path,sheetname,i,1)
    data = "name":{}.format(name)
    s = requests.Session()
    session = s.post(url,headers=s.headers,data=data)

if __name__ == '__main__':
    processes = [Process(target=thread_task, args=(i,)) for i in range(2,100)]
    for process in processes:
        process.start()
    for process in processes:
        process.join()

我删除了密码锁,现在可以使用了。似乎锁同时阻止了其他进程 运行。

您可能想尝试上一层并通过使用 bash 在 for 循环中输入脚本的参数执行并发请求。从我在你的代码中读到的内容来看,你想要并行 运行 的进程(你正在发出的请求)之间似乎没有任何依赖关系,所以考虑到 运行 这些是安全的作为对同一个 python 脚本的 100 次单独调用,让操作系统担心并发性。

您应该可以通过在 bash for 循环中添加参数来实现此目的,如下所示:

for i in {2..100}
do
    run_script.py $i
done

然后在您的 python 脚本中,您将使用 sys 模块获取此参数


if __name__ == "__main__":
    i = sys.argv[1] # 0 is the name of the script being ran (e.g. run_script.py)
    funct(i)

然后重写你的 funct 函数来处理参数。希望对您有所帮助!

P.S。如果您需要进行更复杂的流程协调,调用库可以提供很多帮助:http://www.pyinvoke.org/

很多人并不关心在 Python 中学习多处理。他们只是想把事情做好。

他们中的一些人使用 GNU Parallel 为他们做多处理。这样他们只需要制作一个带参数的单线程程序。

在您的情况下,您应该能够进行此更改:

def funct(i):
    name = readData(path,sheetname,i,1)
    data = "name":{}.format(name)
    s = requests.Session()
    session = s.post(url,headers=s.headers,data=data)


if __name__ == "__main__":if __name__ == "__main__":
    funct(sys.argv[1])

那么你可以运行:

seq 200 | parallel --jobs 100 python myscript.py {}