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 {}
我想达到的目标:
我想同时运行 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 {}