恼人的扭曲Python问题

2024-05-02 14:31:57 发布

您现在位置:Python中文网/ 问答频道 /正文

出于个人利益,我试图回答以下问题: What is the fastest way to send 100,000 HTTP requests in Python?

到目前为止,这就是我所遇到的,但我正经历着一些非常不稳定的事情。在

installSignalHandlersTrue时,它将挂起。我可以看到DelayedCall实例在reactor._newTimedCalls中,但是processResponse永远不会被调用。在

installSignalHandlersFalse时,它抛出一个错误并正常工作。在

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()

Tags: fromimporttrueurlresponsedeferrorreq
1条回答
网友
1楼 · 发布于 2024-05-02 14:31:57

你用了太多的“反应堆呼叫”(例如,很有可能代理请求调用到reactor)从主线程。我不确定这是否是您的问题,但它仍然不受支持,从非reactor线程发出的唯一reactor调用是reactor.callFromThread. 在

而且,整个建筑看起来很奇怪。你为什么不在主线程上运行反应堆?从reactor读取一个包含10000个请求的完整文件并将其拆分,即使您一次完成所有请求,也不应该是一个问题。在

您可能可以使用不使用任何线程的纯扭曲解决方案。在

相关问题 更多 >