[PYTHON] 두 개의 파이썬 루프를 동시에 실행하려면 어떻게해야합니까?
PYTHON두 개의 파이썬 루프를 동시에 실행하려면 어떻게해야합니까?
파이썬에서 다음과 같이 가정 해 봅시다.
# A loop
for i in range(10000):
Do Task A
# B loop
for i in range(10000):
Do Task B
어떻게이 루프를 파이썬에서 동시에 실행합니까?
해결법
-
==============================
1.동시성을 원한다면, 아주 간단한 예가 있습니다 :
동시성을 원한다면, 아주 간단한 예가 있습니다 :
from multiprocessing import Process def loop_a(): while 1: print("a") def loop_b(): while 1: print("b") if __name__ == '__main__': Process(target=loop_a).start() Process(target=loop_b).start()
이것은 내가 생각할 수있는 가장 기본적인 예일뿐입니다. 어떤 일이 일어나고 있는지 이해하려면 http://docs.python.org/library/multiprocessing.html을 읽어보십시오.
데이터를 다시 프로그램에 보내려면 대기열을 사용하는 것이 좋습니다 (내 경험상 사용하기 가장 쉽습니다).
전역 인터프리터 잠금에 신경 쓰지 않으면 스레드를 대신 사용할 수 있습니다. 프로세스는 인스턴스화하는 데 비용이 많이 들지만 진정한 동시성을 제공합니다.
-
==============================
2.왜 두 프로세스를 동시에 실행하고 싶습니까? 그것은 당신이 그들이 더 빨리 갈 것이라고 생각하기 때문입니다 (그들이 실 거하지 못할 좋은 기회가 있습니다). 동일한 루프에서 작업을 실행하는 것이 좋습니다.
왜 두 프로세스를 동시에 실행하고 싶습니까? 그것은 당신이 그들이 더 빨리 갈 것이라고 생각하기 때문입니다 (그들이 실 거하지 못할 좋은 기회가 있습니다). 동일한 루프에서 작업을 실행하는 것이 좋습니다.
for i in range(10000): doTaskA() doTaskB()
분명한 대답은 스레드를 사용하는 것입니다. 파이썬 스레딩 모듈을보십시오. 그러나 스레딩은 큰 문제이며 많은 함정이 있습니다. 따라서 경로를 따라 가기 전에 미리 읽어보십시오.
또는 파이썬 다중 처리 모듈을 사용하여 별도의 프로세스에서 작업을 실행할 수도 있습니다. 두 작업 모두 CPU 사용량이 많은 경우 컴퓨터에서 여러 코어를보다 효율적으로 사용할 수 있습니다.
coroutines, stackless tasklets, greenlets, CSP 등등과 같은 다른 옵션이 있지만 Task A와 Task B에 대해 더 많이 알지 못하고 왜 동시에 실행해야하는지 더 구체적인 답을 제시하는 것은 불가능합니다.
-
==============================
3.당신이 원했던 것에는 여러 가지 가능한 옵션이 있습니다 :
당신이 원했던 것에는 여러 가지 가능한 옵션이 있습니다 :
많은 사람들이 지적했듯이, 이것은 가장 간단한 방법입니다.
for i in xrange(10000): # use xrange instead of range taskA() taskB()
장점 : 이해하기 쉽고 사용하기 쉽고 별도의 라이브러리가 필요하지 않습니다.
단점 : taskB는 taskA 다음에 완료되어야합니다. 동시에 실행할 수는 없습니다.
또 다른 생각은 다음과 같습니다 : 동시에 두 프로세스를 실행, 파이썬 다중 프로세스 라이브러리를 제공합니다, 다음은 간단한 예입니다 :
from multiprocessing import Process p1 = Process(target=taskA, args=(*args, **kwargs)) p2 = Process(target=taskB, args=(*args, **kwargs)) p1.start() p2.start()
장점 : 백그라운드에서 동시에 작업을 실행할 수 있으며, 작업을 제어 할 수 있습니다 (종료, 중지 등), 작업이 데이터를 교환 할 수 있으며, 동일한 리소스 등을 경쟁하면 동기화 할 수 있습니다.
단점 : 너무 무겁습니다! OS는 자주 전환하며 데이터가 중복되는 경우에도 자체 데이터 공간을 갖습니다. 많은 작업 (예 : 100 개 이상)이있는 경우 원하는 작업이 아닙니다.
스레딩은 프로세스와 비슷하지만 가볍습니다. 이 게시물을 확인하십시오. 그들의 사용법은 매우 유사합니다 :
import threading p1 = threading.Thread(target=taskA, args=(*args, **kwargs)) p2 = threading.Thread(target=taskB, args=(*args, **kwargs)) p1.start() p2.start()
greenlet이나 gevent와 같은 라이브러리는 coroutines라고 불리는 것을 제공하는데, thread는 thread보다 빠르다고합니다. 예제가 제공되지 않습니다. Google에 관심이 있으시면 사용 방법을 알려주세요.
장점 :보다 유연하고 가벼운
단점 : 추가 라이브러리 필요, 학습 곡선.
-
==============================
4.
from threading import Thread def loopA(): for i in range(10000): #Do task A def loopB(): for i in range(10000): #Do task B threadA = Thread(target = loopA) threadB = Thread(target = loobB) threadA.run() threadB.run() # Do work indepedent of loopA and loopB threadA.join() threadB.join()
-
==============================
5.방법 : 범위 (10000)의 i에 대한 루프 : 작업 A, 작업 B를 수행합니까? 정보가 없으면 나는 더 좋은 대답을하지 못한다.
방법 : 범위 (10000)의 i에 대한 루프 : 작업 A, 작업 B를 수행합니까? 정보가 없으면 나는 더 좋은 대답을하지 못한다.
-
==============================
6.스레딩이나 멀티 프로세싱을 사용할 수 있습니다.
스레딩이나 멀티 프로세싱을 사용할 수 있습니다.
-
==============================
7."다중 처리"내에서 "풀"하위 모듈을 사용하면 Python 스크립트 내에서 여러 프로세스를 동시에 실행하는 데 놀랍도록 작동합니다.
"다중 처리"내에서 "풀"하위 모듈을 사용하면 Python 스크립트 내에서 여러 프로세스를 동시에 실행하는 데 놀랍도록 작동합니다.
섹션 : 작업자 풀 사용을 참조하십시오.
예제에서 "여러 평가를 비동기 적으로 더 많은 프로세스를 사용할 수 있습니다"라고 신중하게 검토하십시오. 일단 그 행이 무엇을하는지 이해하면, 다음 예제를 만들면 많은 의미가 있습니다.
import numpy as np from multiprocessing import Pool def desired_function(option, processes, data, etc...): # your code will go here. option allows you to make choices within your script # to execute desired sections of code for each pool or subprocess. return result_array # "for example" result_array = np.zeros("some shape") # This is normally populated by 1 loop, lets try 4. processes = 4 pool = Pool(processes=processes) args = (processes, data, etc...) # Arguments to be passed into desired function. multiple_results = [] for i in range(processes): # Executes each pool w/ option (1-4 in this case). multiple_results.append(pool.apply_async(param_process, (i+1,)+args)) # Syncs each. results = np.array(res.get() for res in multiple_results) # Retrieves results after # every pool is finished! for i in range(processes): result_array = result_array + results[i] # Combines all datasets!
코드는 기본적으로 설정된 수의 프로세스에 대해 원하는 기능을 실행합니다. 당신은 신중하게 함수가 각 프로세스를 구별 할 수 있는지 확인해야합니다. (따라서 변수 "옵션"을 추가 한 이유는 무엇입니까?) 또한, 결국 채워지는 배열 일 필요는 없지만, 그게 내가 사용했던 방법이야. 이것이 단순 해지거나 파이썬에서 멀티 프로세싱의 힘을 더 잘 이해할 수 있기를 희망합니다!
from https://stackoverflow.com/questions/3474382/how-do-i-run-two-python-loops-concurrently by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] SQLAlchemy는 DESDENDING을 명령합니까? (0) | 2018.10.28 |
---|---|
[PYTHON] 주어진 패턴의 임의의 텍스트 문자열 생성하기 (0) | 2018.10.28 |
[PYTHON] 팬더 DataFrame에서 특정 셀의 값을 iloc으로 설정 (0) | 2018.10.28 |
[PYTHON] 회전하는 명령 행 커서를 만드는 방법은 무엇입니까? (0) | 2018.10.28 |
[PYTHON] Mac OS X에서 현재 활성 창 / 문서의 제목 가져 오기 (0) | 2018.10.28 |