Multiprocessing Python
Introduction | |
Простой пример | |
Цикл | |
Более сложный пример |
Introduction
В этой статье вы узнаете как запускать несколько процессов одновременно.
Простой пример
import multiprocessing
import time
start = time.perf_counter()
def do_something():
print('Sleeping 1 second...')
time.sleep(1)
print('Done Sleeping...')
p1 = multiprocessing.Process(target=do_something)
p2 = multiprocessing.Process(target=do_something)
p1.start()
p2.start()
p1.join()
p2.join()
finish = time.perf_counter()
print(f'Finished in {round(finish-start, 2)} second(s)')
Цикл
Когда нужно запустить большое количество процессов одновременно, это можно сделать с помощью цикла.
import multiprocessing
NUMBER_OF_TASKS = 10
p_list = []
for _ in range(0, NUMBER_OF_TASKS):
p = multiprocessing.Process(target=connect_to_url)
p.start()
p_list.append(p)
for process_ in p_list:
process_.join()
Приближенный к жизни пример
import requests
import multiprocessing
import datetime
import sys
import urllib3
import time
import subprocess
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
NUMBER_OF_TASKS = int(sys.argv[1])
p_list = []
def main():
main_start_time = datetime.datetime.utcnow()
for _ in range(0, NUMBER_OF_TASKS):
p = multiprocessing.Process(target=connect_to_url)
p.start()
p_list.append(p)
for process_ in p_list:
process_.join()
main_finish_time = datetime.datetime.utcnow()
tdelta = main_finish_time - main_start_time
finish = time.perf_counter()
with open("performance_data.txt", "a") as pf:
pf.write(f"Started: {main_start_time}; Nprocesses: {NUMBER_OF_TASKS }; Elapsed time: {tdelta}; Nerrors: {ERR_COUNT} \r\n")
def connect_to_url():
url = 'https://192.168.0.2/authentication/api/oauth2/token'
auth = ('secret_name','secret_code')
payload = {
'grant_type': 'password',
'username': 'secret_username',
'password': 'secret_password',
}
r = requests.post(url, auth=auth, data=payload, verify=False)
_status_code = r.status_code
if _status_code != 200:
print(_status_code)
err_log_name = main_start_time + "_error_log.txt"
with open("./logs/{err_log_name}", "a") as pf:
pf.write(f"Error: {_status_code} \r\n")
if __name__ == '__main__':
main()