맨땅에 헤딩하는 사람

Windows 환경 python multiprocessing 시 freeze_support() 본문

파이썬/이론

Windows 환경 python multiprocessing 시 freeze_support()

purplechip 2020. 8. 9. 15:35

python multiprocessing에서 mysqlclient를 사용했더니 에러가 발생했다. 파이썬 multiprocessing 공식 문서를 찾아보니 다음과 같은 내용을 찾을 수 있었다.

 

multiprocessing.freeze_support()

multiprocessing을 사용하는 프로그램이 고정되어(frozen) 윈도우 실행 파일을 생성할 때를 위한 지원을 추가합니다. (py2exe, PyInstaller  cx_Freeze 에서 테스트 되었습니다.)

freeze_support() 줄이 생략된 경우 고정된 실행 파일을 실행하려고 하면 RuntimeError 가 발생합니다.

freeze_support() 호출은 윈도우가 아닌 다른 운영 체제에서 실행될 때는 아무런 영향을 미치지 않습니다. 또한, 모듈이 윈도우상의 파이썬 인터프리터에 의해 정상적으로 실행되는 경우 (프로그램이 고정되지 않은 경우)에도 freeze_support() 는 아무 효과가 없습니다.

따라서 윈도우 실행파일과 연결된 코드를 multiprocessing으로 실행시킬 때 넣어주면 된다. 해당 링크에서는 fork 기능 부족으로 인해 사용해야 된다고 설명한다. 아래 코드가 freeze_support()를 삽입하여 수정한 코드이다. 

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
import random
from multiprocessing import Process, freeze_support
from qpkg.StockDB import StockDB
from qpkg.config import configUpdate
import time
 
def multi(data, idx):
    db = StockDB(user=configUpdate.USER,
                 pwd=configUpdate.PWD,
                 db=configUpdate.DB)
    for i in data:
        db.cur.execute('INSERT INTO test(b, c) VALUES ({0}, {1})'.format(i, idx))
    db.commit()
    db.close()
 
if __name__=='__main__':
    freeze_support() # for multiprocessing other process on windows
    data = [[random.randint(0,100for i in range(5000)] for j in range(5)]
    procs = []
    start_time = time.time()
 
    for idx, n in enumerate(data):
        proc = Process(target=multi, args=(n,idx))
        procs.append(proc)
        proc.start()
 
    for proc in procs:
        proc.join()
 
    end_time = time.time()
    print('time : {0}'.format(end_time - start_time))
cs

StockDB는 내가 임의로 만든 library다. MySQLdb라 생각하면 된다. 어쨌든 freeze_support()를 넣어줌으로써 RuntimeError를 막을 수 있다.

 

DB 데이터 삽입도 정상적으로 이루어졌음을 확인할 수 있다.

MariaDB [kstock]> SELECT * FROM test ORDER BY a DESC LIMIT 10;
+-------+------+------+
| a     | b    | c    |
+-------+------+------+
| 25000 |   89 |    4 |
| 24999 |   88 |    4 |
| 24998 |   55 |    4 |
| 24997 |   11 |    4 |
| 24996 |   42 |    4 |
| 24995 |   64 |    4 |
| 24994 |    6 |    4 |
| 24993 |   91 |    4 |
| 24992 |   89 |    4 |
| 24991 |   43 |    4 |
+-------+------+------+
10 rows in set (0.000 sec)
cs

다만 오늘 에러 내용을 캡쳐하려고 함수 없이 실행시키니 에러 없이 잘돌아간다. 대체 무슨 상황인지 모르겠다.

 

참고

python multiprocessing doc.

https://python.flowdas.com/library/multiprocessing.html

freeze_support()를 넣는 이유

https://stackoverflow.com/questions/13922597/multiprocessing-freeze-support

Comments