2015-01-16 2 views
2

내 질문은 이것입니다. 동시에 두 개의 서로 다른 URL을 요청할 수 있습니까?urllib2.urlopen()을 동시에 사용하는 여러 요청

내가 뭘하려는거야 파이썬 스크립트를 사용하여 동시에 두 개의 다른 요청을 호출하는 것입니다. 두 개의 PHP 스크립트를 동시에 (다른 서버에서 터미널 명령을 실행하여) 실행합니다. 제 문제는 제가 서로를 바로 뒤에서 할 수 없다는 것입니다. 왜냐하면 그들은 각각 특정한 시간을 가지고 동시에 행동해야하고 동시에 끝내야하기 때문입니다.

urllib2.urlopen을 사용하면 가능합니까? 그렇다면 어떻게해야할까요?

그렇지 않은 경우 어떻게해야 좋을까요?

import urllib2 
... 
if cmd.startswith('!command '): 
    cmdTime = cmd.replace('!command ','',1) 
    urllib2.urlopen('http://example.com/page.php?time='+cmdTime) 
    urllib2.urlopen('http://example2.com/page.php?time='+cmdTime) 
    print "Finished." 

내 문제들이 동시에 실행하지 않는 것이있다 :

현재 내가 좋아하는 뭔가가있다.

! command! 60을 실행하면 60 초 동안 site.com을 실행 한 다음 60 초 동안 site2.com으로 이동하여 실행합니다.

+2

스레딩이 유용 할 수 있습니다. http://stackoverflow.com/questions/16181121/python-very-simple-multithreading-parallel-url-fetching-without-queue –

+0

솔루션과 함께 비슷한 문제에 대해이 게시물을 참조하십시오. http://stackoverflow.com/questions/ 27021440/python-requests-dont-wait-for-request-to-finish/27022707 # 27022707 "urllib2"보다 "requests"가 일반적으로 사용하기 쉽지만이 경우에는 둘 중 하나가 작동합니다. –

답변

3

구문 분석 된 소스를 가져 오는 함수를 만드는 것이 좋습니다. 여기서 URL 목록을 인수로 전달하여 목록으로 크롤링해야합니다. 나중에 URL 목록에서 루프를 반복하고 스레딩을 사용합니다. 샘플 코드를 게시 해드립니다. 그에 맞게 수정하십시오.

import threading 
import urllib2 


def execute_url_list(urls_list): 
    if cmd.startswith('!command '): 
    cmdTime = cmd.replace('!command ','',1) 
    for url in urls_list: 
     urllib2.urlopen(url+cmdTime) 

urls_list = ['url1', 'url2'] 

for k in urls_list: 
    processes = [] 
    process = threading.Thread(target=execute_url_list, args=[k]) 
    process.setDaemon(True) 
    process.start() 
    processes.append(process) 


for process in processes: 
    process.join() 
+0

urllib2에 대한 몇 가지 [스레드 안전 문제] (http://stackoverflow.com/questions/5825151/are-urllib2-and-httplib-thread-safe)가 있습니다.이 예제는 URL이 문자열. – KillianDS

+0

@KillianDS : 스레딩에 제약 조건이 있지만 문자열 URL로 문제가 발생하지 않는다는 것에 동의합니다. 나는 오랫동안 그것을 사용 해왔다. 그 점을 지적 해 주셔서 감사합니다. – Prateek

0

멀티 스레드를 사용하여 하나의 스레드에서 하나의 요청을 보낼 수 있다고 생각합니다. 파이썬에서는 threading.Thread 클래스를 상속 받아 run 메서드를 재정의 (override) 할 수 있습니다. 두 스레드를 시작하고 두 스레드에서 동기를 사용하여 두 요청이 거의 동일하게 전송되는지 확인할 수 있습니다.

하지만 네트워크 시간과 시스템 일정 시간이 사용자의 통제하에 있지 않기 때문에 서버의 PHP 스크립트가 정확히 실행될 수 없다고 생각합니다.

관련 문제