-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathParallelTasks.py
More file actions
62 lines (49 loc) · 2.21 KB
/
ParallelTasks.py
File metadata and controls
62 lines (49 loc) · 2.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 4 (для особенно везучих).
# Консольная программа.
# Принимает 2 аргумента: текстовый файл с задачами, количество процессов.
# В текстовом файле описаны задачи. Описание задачи: <задача>\t<аргументы>.
# Каждая строка – задача. Всего 2 типа задач:
# -посчитать количество чётных чисел на промежутке,
# -проверка числа на простоту.
# Результаты работы программы вывести в файлы task1.out, ... taskn.out.
# Итого: нужно прочитать таски, распределить их по процессам,
# результат работы процессов записать в файлы.
# Количество выходных файлов равно количеству процессов.
import argparse
from multiprocessing import Pool
def is_prime(n):
if n < 2:
return False
if n % 2 == 0:
return n == 2
d = 3
while d * d <= n and n % d != 0:
d += 2
return d * d > n
def count_numbers(a, b):
return (b - a + 1) // 2 + (0 if a % 2 or b % 2 else 1)
def perform_task(task_with_index):
index = task_with_index[0]
task = task_with_index[1].split()
if task[0] == 'count':
res = count_numbers(*map(int, task[1:]))
elif task[0] == 'prime':
res = is_prime(int(task[1]))
with open("task{0}.out".format(index), 'w') as f:
f.write("{0} -> {1}".format(task_with_index[1], res))
def main(args):
f = args.file
count = args.count
if count <= 0:
raise ValueError("amount of processes must be positive")
tasks = f.read().split('\n')
tasks = [(i, tasks[i]) for i in range(len(tasks))]
with Pool(processes=count) as pool:
pool.map(perform_task, tasks)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('file', type=argparse.FileType('r'), help='input file')
parser.add_argument('count', type=int, help='amount of processes')
args = parser.parse_args()
if args:
main(args)