2017-01-24 2 views
1

셀렌 스크립트를 실행하기 위해 파이썬 다중 처리 라이브러리를 사용하고 있습니다. 내 코드는 다음과 같습니다 :연속 루프에서 파이썬 다중 처리 풀을 사용하는 방법

#-- start and join multiple threads --- 
thread_list = [] 
total_threads=10 #-- no of parallel threads 
for i in range(total_threads): 
    t = Process(target=get_browser_and_start, args=[url,nlp,pixel]) 
    thread_list.append(t) 
    print "starting thread..." 
    t.start() 

for t in thread_list: 
    print "joining existing thread..." 
    t.join() 

나는 join() 기능을 알 수있는 바와 같이,이 완료 될 때까지 각 프로세스에 대해 대기합니다. 그러나 프로세스가 해제 되 자마자 새로운 기능을 수행하는 또 다른 작업이 할당되기를 바랍니다.

는 이것은 다음과 같이 이해 될 수있다 :

8 개 프로세스가 첫 번째 인스턴스에서 시작 말한다. 대신 모든 이제 다음 새로운 프로세스를 시작하는

no_of_tasks_to_perform = 100 

for i in range(no_of_tasks_to_perform): 
    processes start(8) 
    if process no 2 finished executing, start new process 
    maintain 8 process at any point of time till 
    "i" is <= no_of_tasks_to_perform 

답변

1

하는 multiprocessing.Queue()에 모든 작업을 넣어 시도하고 새 작업을 얻을 수있는 작업 대기열에 액세스하는 방법에 계속 8 장기 실행중인 각 프로세스에서,을 처리 시작 더 이상 일이 없을 때까지 일을하십시오. 귀하의 경우에는

, 그것은이 같은 더있다 :

from multiprocessing import Queue, Process 

def worker(queue): 
    while not queue.empty(): 
     task = queue.get() 

     # now start to work on your task 
     get_browser_and_start(url,nlp,pixel) # url, nlp, pixel can be unpacked from task 

def main(): 
    queue = Queue() 

    # Now put tasks into queue 
    no_of_tasks_to_perform = 100 

    for i in range(no_of_tasks_to_perform): 
     queue.put([url, nlp, pixel, ...]) 

    # Now start all processes 
    process = Process(target=worker, args=(queue,)) 
    process.start() 
    ... 
    process.join() 
+0

그것이 –

+0

@shane @Shane ... 잘 날 위해 감사했다, 어디에서이 설정의 8 개 프로세서는? 간단히 말해서 : process.start (8). webDriver 인스턴스를 설정하고 대기열의 매개 변수로 내 스크래핑 함수를 호출하도록 클래스를 초기화 할 수있는 사용자 정의 파이썬 모듈 I 소스가 있습니다. 하지만 하나의 X-window 프레임 버퍼 (Xvfb)와 headless chromedriver 인스턴스가 8 개의 다른 프로세스로 작업 대기열 (수천 개)을 실행하는 방법을 궁금해하기 때문에 8 개의 다른 webDrivers를 풀로 인스턴스화해야 할 필요가 없습니다. ? – Ricalsin

+0

이 설정에서는 수동으로 8 개의 프로세스 (또는 원하는대로)를 수동으로 시작하고 새로운 작업을 계속 가져올 수 있도록 각각의 프로세스를 장기 실행 프로세스로 만듭니다 (예 : 브라우저를 인스턴스화하고 작업 수행). 'process1 = Process (target = worker, args = (queue,))'...'process8 ...'. 'multiprocessing.Pool'을 사용하기를 원한다면'map'을 사용하여 함수를 전달해야하지만, 실제로는 여러 매개 변수를 사용할 때 특히 편리합니다. http : //stackoverflow.com/a/5442981/7405394 – Shane