Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 금결원
- 구현
- idxmin
- multiprocessing
- 코드블럭
- 멀티 로그인
- 의사 클래스
- DataFrame
- 필기
- 하이라이트
- Tistory
- 티스토리
- HTML
- 웹크롤링
- CSS
- 금융결제원
- idxmax
- OpenAPI+
- 파이썬
- 우리FIS
- highlight.js
- 진행 상황
- Python
- pywinauto
- 퀀트
- pycharm
- Windows
- line number
- freeze_support
- QueueHandler
Archives
- Today
- Total
맨땅에 헤딩하는 사람
Windows 환경 python multiprocessing 시 freeze_support() 본문
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,100) for 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
'파이썬 > 이론' 카테고리의 다른 글
[Python] tqdm을 사용하여 for 반복, 함수 진행률 출력하기 (0) | 2020.08.23 |
---|---|
[Python] Windows GUI 자동화 pywinauto 사용법 (4) | 2020.08.22 |
Windows 환경 ipython console에서 multiprocessing이 안되는 이유 (1) | 2020.08.09 |
PyCharm 프로젝트 생성 (0) | 2020.08.07 |
[Python] 32bit 아나콘다 mysqlclient 윈도우10에서 설치 시 에러 (0) | 2020.07.13 |
Comments