Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有多个请求的grequests池。会话?_Python_Sockets_Gevent_Grequests - Fatal编程技术网

Python 具有多个请求的grequests池。会话?

Python 具有多个请求的grequests池。会话?,python,sockets,gevent,grequests,Python,Sockets,Gevent,Grequests,我想对REST webserivce做很多url请求。通常在75-90k之间。但是,我需要限制到Web服务的并发连接的数量 我开始以以下方式玩grequests,但很快就开始咀嚼打开的插槽 concurrent_limit=30 urllist=buildUrls() hdrs={'Host':'hostserver'} g_请求=(对于url中的url,grequests.get(url,headers=hdrs) g_响应=grequests.map(g_请求,大小=并发限制) 当它运行一

我想对REST webserivce做很多url请求。通常在75-90k之间。但是,我需要限制到Web服务的并发连接的数量

我开始以以下方式玩grequests,但很快就开始咀嚼打开的插槽

concurrent_limit=30
urllist=buildUrls()
hdrs={'Host':'hostserver'}
g_请求=(对于url中的url,grequests.get(url,headers=hdrs)
g_响应=grequests.map(g_请求,大小=并发限制)
当它运行一分钟左右时,我遇到了“已达到最大套接字数”错误。 据我所知,grequests中的每个requests.get调用都使用自己的会话,这意味着为每个请求打开一个新套接字

我发现了一个关于如何让grequests使用单个会话的注释。但这似乎有效地将所有请求限制在单个共享池中。这似乎违背了异步http请求的目的

s=requests.session()
rs=[grequests.get(url,session=s)表示url中的url]
格雷克斯地图(rs)
是否可以以创建大量会话的方式使用grequests或gevent.Pool


换句话说:如何通过队列或连接池发出多个并发http请求?

rs是一个AsyncRequest列表。每个AsyncRequest都有自己的会话

rs = [grequests.get(url) for url in urls]
grequests.map(rs)
for ar in rs:
    print(ar.session.cookies)

我最终没有使用grequests来解决我的问题。我仍然希望这是可能的

我使用线程:

class MyAwesomeThread(Thread):
    """
    Threading wrapper to handle counting and processing of tasks
    """
    def __init__(self, session, q):
        self.q = q
        self.count = 0
        self.session = session
        self.response = None
        Thread.__init__(self)

    def run(self): 
        """TASK RUN BY THREADING"""
        while True:
            url, host = self.q.get()
            httpHeaders = {'Host' : host}
            self.response = session.get(url, headers=httpHeaders)
            # handle response here
            self.count+= 1
            self.q.task_done()
        return

q=Queue()
threads = []
for i in range(CONCURRENT):
    session = requests.session()
    t=MyAwesomeThread(session,q)
    t.daemon=True # allows us to send an interrupt 
    threads.append(t)


## build urls and add them to the Queue
for url in buildurls():
    q.put_nowait((url,host))

## start the threads
for t in threads:
    t.start()
大概是这样的:

NUM_SESSIONS = 50
sessions = [requests.Session() for i in range(NUM_SESSIONS)]
reqs = []
i = 0
for url in urls:
    reqs.append(grequests.get(url, session=sessions[i % NUM_SESSIONS]
    i+=1
responses = grequests.map(reqs, size=NUM_SESSIONS*5)

这将把请求分散到50个不同的会话中

是的,我发现的问题是每个请求都有自己的会话。这意味着7万次会议。操作系统不太喜欢这样。我需要限制会话的数量。我想我有一个类似的问题:操作系统喜欢70个线程吗?为什么将
.map
限制大小设置为会话数量的5倍?并发连接的数量本质上不会受到会话数量的限制吗?