파이썬 질문

네이쳐   
   조회 4734   추천 0    

안녕하세요

파이썬으로 제가 사용하는 계산을 자동으로 처리하려고 하는데,

지금까지는 제가 이렇게 사용했습니다. (제대로 짠건지는 모르겠지만 일단 작동은 잘되네요).

계산 한번에 10분이 걸린다고 하면 (코어 1개만 사용합니다), 순차적으로 10분씩 걸려서 끝날 때 까지 너무 오래걸립니다.

cpu 코어가 32개라서 동시에 계산을 하고싶은데, 가능한가요??

조언부탁드립니다.

감사합니다.



짧은글 일수록 신중하게.
chis 2020-06
시간이 좀 된지라 저도 기억이 가물가물한데요.
ffmpeg으로 다수의 음성파일을 트랜스코딩 하려고 했는데 코어1개로만 작업을 하니까 오래걸려서
멀티코어로 해볼라고 삽질을 좀 했었는데 결론은 실패했습니다..
외부 프로그램을 불러오는건 이상하게 안되더라고요..
물론 제가 실력이 많이 미천한고로 가능한것을 못한것일 가능성이 크긴하지만 참고하세요..
엠브리오 2020-06
패러렐 프로그래밍을 하셔야죠.
일반적인 프로그램들은 CPU 한개만 씁니다.

https://blog.naver.com/PostView.nhn?blogId=woosoung1993&logNo=221639525899
무아 2020-06
하나의 스크립트로 for 문 10개의 작업 할 것을
for 문 없이 하나만 할 수 있는 스크립트를 10개 따로 (동시에 백그라운드로) 돌리는 것이 좋지않을까요??
Wheein 2020-06
실제 일은 다른 프로세스가 하고, 파이썬은 stdin, stdout 만 관리하는 것이니 thread 만 나누어도 될 것 같습니다.

from concurrent.futures import ThreadPoolExecutor

def _do_work(i):
    command = "..."
    p = Popen(command, ...)
    p.communicate(...)

with ThreadPoolExecutor(32) as pool:
    pool.map(_do_work, [110, 120, ...])

대강 요런 느낌으로요
잘 만드신 것 같은데요. 프로세스는 10개가 생성되어서 돌아갈텐데... 아마 I/O때문에 block되어서 그 결과를 python이 가져가 줄 때까지 기다리기 때문에 순차적으로 돌아가는 것처럼 보이는 것 같습니다. I/O를 파일에서 받고 파일로 저장되도록 한다면, 각각의 프로세스는 따로 돌아갈 겁니다. 다 돌고 파일에서 결과를 확인하면 되겠죠.
하지만, process들이 같은 리소스를 공유해서 사용해야 한다면, 결과는 동일할 거라고 생각됩니다.

절대 그럴 일이 안 생기게 예를 들어 아래처럼 무한 loop을 하나 만들고...

root@ubuntu-20:~/python_subprocess# cat loop.c
#include <unistd.h>
#include <stdio.h>

int main(void)
{
  while (1) {
    usleep(1);
  }
}

컴파일 한 다음, 파이썬에서 돌려보면...
root@ubuntu-20:~/python_subprocess# python3
Python 3.8.2 (default, Apr 27 2020, 15:53:34)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> proc_list = []
>>> for x in range(10):
...    proc_list.append(subprocess.Popen(["./loop"]))
...
>>> proc_list
[<subprocess.Popen object at 0x7f2bdbc332b0>, <subprocess.Popen object at 0x7f2bdbc67520>, <subprocess.Popen object at 0x7f2bdbc67cd0>, <subprocess.Popen object at 0x7f2bdbbe4070>, <subprocess.Popen object at 0x7f2bdbbe40a0>, <subprocess.Popen object at 0x7f2bdbbe4130>, <subprocess.Popen object at 0x7f2bdbbe4190>, <subprocess.Popen object at 0x7f2bdbbe41f0>, <subprocess.Popen object at 0x7f2bdbbe4880>, <subprocess.Popen object at 0x7f2bdbbe48b0>]

잘 살아 있는지 확인... None을 리턴하면 죽지 않고 살았다는 의미임.
>>> [x.poll() for x in proc_list]
[None, None, None, None, None, None, None, None, None, None]
>>>

다른 창에서 돌아가고 있는 지 확인...
root@ubuntu-20:~/python_subprocess# ps ax | grep ./loop
  6519 pts/2    S      0:15 ./loop
  6520 pts/2    S      0:15 ./loop
  6521 pts/2    S      0:15 ./loop
  6522 pts/2    S      0:15 ./loop
  6523 pts/2    S      0:15 ./loop
  6524 pts/2    R      0:15 ./loop
  6525 pts/2    S      0:15 ./loop
  6526 pts/2    S      0:15 ./loop
  6527 pts/2    S      0:15 ./loop
  6528 pts/2    S      0:15 ./loop

top으로 확인해도 저정도면 상위 10개를 차지하고 있을 거고요.
네이쳐 2020-06
답변들 감사합니다. 참고해서 공부해보겠습다~~


QnA
제목Page 3807/5712
2014-05   5174288   정은준1
2015-12   1708367   백메가
2015-03   4321   허뱀
2016-04   4321   김도형
2018-06   4321   전설속의미…
2015-05   4321   VSPress
2015-08   4321   TheNorthStar
2023-02   4321   블룽
2018-05   4321   스톤콜드
2016-03   4321   하나룸
2015-02   4320   김건우
2016-07   4320   행복하세
2015-11   4320   trevas
2015-05   4320   삐돌이슬픔이
2015-03   4320   김한영
2015-04   4320   공간사랑
2018-10   4320   앤드유저
2017-05   4320   이세규
2015-09   4320   박문형
2020-01   4320   mitchell
2021-09   4320   keros
2016-12   4320   포카