出于个人利益,我试图回答以下问题: What is the fastest way to send 100,000 HTTP requests in Python?
到目前为止,这就是我所遇到的,但我正经历着一些非常不稳定的事情。在
当installSignalHandlers为True时,它将挂起。我可以看到DelayedCall
实例在reactor._newTimedCalls
中,但是processResponse
永远不会被调用。在
当installSignalHandlers为False时,它抛出一个错误并正常工作。在
from twisted.internet import reactor
from twisted.web.client import Agent
from threading import Semaphore, Thread
import time
concurrent = 100
s = Semaphore(concurrent)
reactor.suggestThreadPoolSize(concurrent)
t=Thread(
target=reactor.run,
kwargs={'installSignalHandlers':True})
t.daemon=True
t.start()
agent = Agent(reactor)
def processResponse(response,url):
print response.code, url
s.release()
def processError(response,url):
print "error", url
s.release()
def addTask(url):
req = agent.request('HEAD', url)
req.addCallback(processResponse, url)
req.addErrback(processError, url)
for url in open('urllist.txt'):
addTask(url.strip())
s.acquire()
while s._Semaphore__value!=concurrent:
time.sleep(0.1)
reactor.stop()
下面是installSignalHandlers为True时引发的错误: (注意:这是预期的行为!问题是,当installSignalHandlers为False时,它为什么不工作。)
^{pr2}$我做错了什么?正确的方法是什么?我是新来的。在
@莫斯赫兹: 谢谢。它现在起作用了:
from twisted.internet import reactor, threads
from urlparse import urlparse
import httplib
import itertools
concurrent = 100
finished=itertools.count(1)
reactor.suggestThreadPoolSize(concurrent)
def getStatus(ourl):
url = urlparse(ourl)
conn = httplib.HTTPConnection(url.netloc)
conn.request("HEAD", url.path)
res = conn.getresponse()
return res.status
def processResponse(response,url):
print response, url
processedOne()
def processError(error,url):
print "error", url#, error
processedOne()
def processedOne():
if finished.next()==added:
reactor.stop()
def addTask(url):
req = threads.deferToThread(getStatus, url)
req.addCallback(processResponse, url)
req.addErrback(processError, url)
added=0
for url in open('urllist.txt'):
added+=1
addTask(url.strip())
try:
reactor.run()
except keyboardInterrupt:
reactor.stop()
你用了太多的“反应堆呼叫”(例如,很有可能代理请求调用到reactor)从主线程。我不确定这是否是您的问题,但它仍然不受支持,从非reactor线程发出的唯一reactor调用是reactor.callFromThread. 在
而且,整个建筑看起来很奇怪。你为什么不在主线程上运行反应堆?从reactor读取一个包含10000个请求的完整文件并将其拆分,即使您一次完成所有请求,也不应该是一个问题。在
您可能可以使用不使用任何线程的纯扭曲解决方案。在
相关问题 更多 >
编程相关推荐