복붙노트

[PYTHON] 두 개의 파이썬 루프를 동시에 실행하려면 어떻게해야합니까?

PYTHON

두 개의 파이썬 루프를 동시에 실행하려면 어떻게해야합니까?

파이썬에서 다음과 같이 가정 해 봅시다.

# A loop
for i in range(10000):
    Do Task A

# B loop
for i in range(10000):
    Do Task B

어떻게이 루프를 파이썬에서 동시에 실행합니까?

해결법

  1. ==============================

    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. ==============================

    2.왜 두 프로세스를 동시에 실행하고 싶습니까? 그것은 당신이 그들이 더 빨리 갈 것이라고 생각하기 때문입니다 (그들이 실 거하지 못할 좋은 기회가 있습니다). 동일한 루프에서 작업을 실행하는 것이 좋습니다.

    왜 두 프로세스를 동시에 실행하고 싶습니까? 그것은 당신이 그들이 더 빨리 갈 것이라고 생각하기 때문입니다 (그들이 실 거하지 못할 좋은 기회가 있습니다). 동일한 루프에서 작업을 실행하는 것이 좋습니다.

    for i in range(10000):
        doTaskA()
        doTaskB()
    

    분명한 대답은 스레드를 사용하는 것입니다. 파이썬 스레딩 모듈을보십시오. 그러나 스레딩은 큰 문제이며 많은 함정이 있습니다. 따라서 경로를 따라 가기 전에 미리 읽어보십시오.

    또는 파이썬 다중 처리 모듈을 사용하여 별도의 프로세스에서 작업을 실행할 수도 있습니다. 두 작업 모두 CPU 사용량이 많은 경우 컴퓨터에서 여러 코어를보다 효율적으로 사용할 수 있습니다.

    coroutines, stackless tasklets, greenlets, CSP 등등과 같은 다른 옵션이 있지만 Task A와 Task B에 대해 더 많이 알지 못하고 왜 동시에 실행해야하는지 더 구체적인 답을 제시하는 것은 불가능합니다.

  3. ==============================

    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. ==============================

    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. ==============================

    5.방법 : 범위 (10000)의 i에 대한 루프 : 작업 A, 작업 B를 수행합니까? 정보가 없으면 나는 더 좋은 대답을하지 못한다.

    방법 : 범위 (10000)의 i에 대한 루프 : 작업 A, 작업 B를 수행합니까? 정보가 없으면 나는 더 좋은 대답을하지 못한다.

  6. ==============================

    6.스레딩이나 멀티 프로세싱을 사용할 수 있습니다.

    스레딩이나 멀티 프로세싱을 사용할 수 있습니다.

  7. ==============================

    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!
    

    코드는 기본적으로 설정된 수의 프로세스에 대해 원하는 기능을 실행합니다. 당신은 신중하게 함수가 각 프로세스를 구별 할 수 있는지 확인해야합니다. (따라서 변수 "옵션"을 추가 한 이유는 무엇입니까?) 또한, 결국 채워지는 배열 일 필요는 없지만, 그게 내가 사용했던 방법이야. 이것이 단순 해지거나 파이썬에서 멀티 프로세싱의 힘을 더 잘 이해할 수 있기를 희망합니다!

  8. from https://stackoverflow.com/questions/3474382/how-do-i-run-two-python-loops-concurrently by cc-by-sa and MIT license