-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
89 lines (68 loc) · 2.59 KB
/
main.py
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env python
# coding: utf-8
#from globals import * # src globals.py
#from util import * # src util.py
from process import * # src process.py
from threads import * # src threads.py
from time import time
'''
Multiprocessing: ->
PROS:
1. Aproveita múltiplas CPUs e núcleos, se houverem
2. Ótimo para aplicações CPU-bound, poucas operações de entrada e saída
CONTRAS:
1. Maior consumo de memória, geralmente mais lento
2. IPC (Interprocess Communication) mais complicado
Threading: ->
PROS:
1. Mais rápido de criar e gerenciar, menor consumo de memória
2. Torna as aplicações mais responsivas
3. Ótima para aplicações I/O-bound, muitas operações de entrada e saída, ou consultas a banco de dados, por exemplo
CONTRAS:
1. primitivas de controle (locks) para memória compartilhada
2. difícil de depurar, potenciais condições de corrida
3. Apenas uma thread controla a GIL (Global Interpreter Lock)
Ou seja, nas threads para o python, as máquinas tem sempre 1 core
'''
if __name__ == '__main__':
## Criar matriz de num aleatorios
globals.init(150) # Tamanho da matriz
#printMatriz(globals.matriz)
#print('Matriz gerada.')
n = len(globals.matriz) # qnt de processos
if globals.modo=='multiprocessing' or globals.modo=='both': # Executar processos concorrentes
print('criando processos...')
fila = Queue() # Fila com os valores de retorno
# Cria processos-flihos e os add na lista
## Criar processos para cada rotina
processos = [Process(name='worker{}'.format(i),target=pRoutine,args=(fila,i)) for i in range(n)]
tempo = time()
#print('Tempo inicial da CPU: {}'.format(tempo))
# Inicia a execução concorrente
for p in processos:
p.start()
# Espera o término dos processos-filhos
for p in processos:
p.join()
globals.contaPrimos = soma(fila,n) # ContaPrimos
print('{} num primos encontrados.'.format(globals.contaPrimos))
fim = time()
#print('Tempo final da CPU: {}'.format(tempo))
print('Intervalo de execução {}.'.format(fim - tempo))
if globals.modo=='threading' or globals.modo=='both': # # Executar threads
globals.contaPrimos = 0
print('criando threads...')
# criar threads
threads = [Thread(name='thread {}'.format(i),target=tRoutine,args=(i,)) for i in range(n)]
tempo = time()
#print('Tempo inicial da CPU: {}'.format(tempo))
# Inicia a execução das threads
for t in threads:
t.start()
# Espera o término das threads
for t in threads:
t.join()
print('{} num primos encontrados.'.format(globals.contaPrimos))
fim = time()
#print('Tempo final da CPU: {}'.format(tempo))
print('Intervalo de execução {}.'.format(fim - tempo))