대부분의 경우 사용자의 문제는 HTML을 빠르게 구문 분석하고 순차적 인 작업에서 페이지 검색 및 차단의 지연과 관련된 모든 기능과 관련이 없습니다.
1-2 초는 페이지를 검색하는 데 알맞은 시간입니다. 페이지 순서의 텍스트를 빠르게 찾을 수 있어야합니다. 그러나 한 번에 한 페이지 씩 처리하는 경우 결과를 찾을 수있는 동안 웹 서버의 응답을 기다리지 못하게 차단됩니다. 대신 작업자 프로세스를 통해 한 번에 여러 페이지를 가져 와서 출력 만 대기 할 수 있습니다.
다음 코드는 문제를 좀더 자세히 해결하기 위해 Python's multiprocessing docs에서 수정되었습니다.
import urllib
from multiprocessing import Process, Queue
def worker(input, output):
for func, args in iter(input.get, 'STOP'):
result = func(*args)
output.put(result)
def find_on_page(num):
uri = 'http://www.example.com/index.php?id=%d' % num
f = urllib.urlopen(uri)
data = f.read()
f.close()
index = data.find('datahere:') # obviously use your own methods
if index < 0:
return None
else:
return data[index:index+20]
def main():
NUM_PROCESSES = 4
tasks = [(find_on_page, (i,)) for i in range(99999)]
task_queue = Queue()
done_queue = Queue()
for task in tasks:
task_queue.put(task)
for i in range(NUM_PROCESSES):
Process(target=worker, args=(task_queue, done_queue)).start()
for i in range(99999):
print done_queue.get()
for i in range(NUM_PROCESSES):
task_queue.put('STOP')
if __name__ == "__main__":
main()
코드를 게시하십시오. – Sylverdrag
오버 헤드가 처음에 데이터를 검색하는 것이 아닙니다. 대부분의 사이트는로드하는 데 1 ~ 2 초가 걸립니다. Python은 충분히 빠르게 작업해야합니다. – Adam
psyco를 사용해 보셨습니까? –