Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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 如何在线程池中延迟执行?_Python_Python 3.x_Multithreading_Web Scraping_Threadpool - Fatal编程技术网

Python 如何在线程池中延迟执行?

Python 如何在线程池中延迟执行?,python,python-3.x,multithreading,web-scraping,threadpool,Python,Python 3.x,Multithreading,Web Scraping,Threadpool,我已经用python编写了一个脚本,使用multiprocessing.pool.ThreadPool并发处理多个请求并执行抓取过程。解析器正在完美地完成它的工作 正如我在几个脚本中注意到的,当使用多处理创建刮片过程时,刮片过程中应该有一个延迟,我想在下面的脚本中也设置一个延迟 然而,这正是我被卡住的地方,我无法找到正确的位置来延迟时间。 这是我目前的脚本: import requests from urllib.parse import urljoin from bs4 import Beau

我已经用python编写了一个脚本,使用
multiprocessing.pool.ThreadPool
并发处理多个请求并执行抓取过程。解析器正在完美地完成它的工作

正如我在几个脚本中注意到的,当使用多处理创建刮片过程时,刮片过程中应该有一个延迟,我想在下面的脚本中也设置一个延迟

然而,这正是我被卡住的地方,我无法找到正确的位置来延迟时间。

这是我目前的脚本:

import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup
from multiprocessing.pool import ThreadPool

url = "http://srar.com/roster/index.php?agent_search=a"

def get_links(link):
    completelinks = []
    res = requests.get(link)  
    soup = BeautifulSoup(res.text,'lxml')
    for items in soup.select("table.border tr"):
        if not items.select("td a[href^='index.php?agent']"):continue
        data = [urljoin(link,item.get("href")) for item in items.select("td a[href^='index.php?agent']")]
        completelinks.extend(data)
    return completelinks

def get_info(nlink):
    req = requests.get(nlink)
    sauce = BeautifulSoup(req.text,"lxml")
    for tr in sauce.select("table[style$='1px;'] tr")[1:]:
        table = [td.get_text(strip=True) for td in tr.select("td")]
        print(table)

if __name__ == '__main__':
    ThreadPool(20).map(get_info, get_links(url))

再一次:我需要知道的是脚本中放置延迟的正确位置。

用于在多个
请求之间放置延迟。get()
调用位于
get_info
中,您必须使用延迟参数展开
get_info
,该参数可以作为
time.sleep()的输入
打电话。由于所有工作线程同时启动,因此每次调用的延迟都必须是累积的。也就是说,如果希望
请求.get()之间的延迟为0.5秒,则传递到池方法中的延迟列表将类似于[0.0,0.5,1.0,1.5,2.0,2.5…]

为了不必改变
get\u info
本身,我在下面的示例中使用了一个decorator来扩展
get\u info
,它带有一个延迟参数和一个
time.sleep(delay)
调用。注意,我在
pool.starmap
调用中,将延迟传递给
get\u info
的另一个参数

import logging
from multiprocessing.pool import ThreadPool
from functools import wraps

def delayed(func):
    @wraps(func)
    def wrapper(delay, *args, **kwargs):
        time.sleep(delay)  # <--
        return func(*args, **kwargs)
    return wrapper

@delayed
def get_info(nlink):
    info = nlink + '_info'
    logger.info(msg=info)
    return info


def get_links(n):
    return [f'link{i}' for i in range(n)]


def init_logging(level=logging.DEBUG):
    fmt = '[%(asctime)s %(levelname)-8s %(threadName)s' \
          ' %(funcName)s()] --- %(message)s'
    logging.basicConfig(format=fmt, level=level)


if __name__ == '__main__':

    DELAY = 0.5

    init_logging()
    logger = logging.getLogger(__name__)

    links = get_links(10) # ['link0', 'link1', 'link2', ...]
    delays = (x * DELAY for x in range(0, len(links)))
    arguments = zip(delays, links) # (0.0, 'link0'), (0.5, 'link1'), ...

    with ThreadPool(10) as pool:
        result = pool.starmap(get_info, arguments)
        print(result)

在您返回之前,请返回CompleteLink
。我仍然有两种方法可以延迟。你是说@stovfl?请检查以澄清。非常感谢。我们不喜欢图片!而是你的问题。你的问题和阐述,正反两种方式?请阅读。别误会我@stovfl。我知道这里不接受图片。然而,我上传了那张图片,以确定你的意思。我之所以提出这个问题(基于你的评论),只是因为你建议推迟的立场并不那么具体,因为我可以用两种方式。顺便说一下,我对缩进有一点了解。关于这两种方法的利弊,你得出了什么结论?注意你的答案太晚了。非常感谢。
[2018-10-03 22:04:14,221 INFO     Thread-8 get_info()] --- link0_info
[2018-10-03 22:04:14,721 INFO     Thread-5 get_info()] --- link1_info
[2018-10-03 22:04:15,221 INFO     Thread-3 get_info()] --- link2_info
[2018-10-03 22:04:15,722 INFO     Thread-4 get_info()] --- link3_info
[2018-10-03 22:04:16,223 INFO     Thread-1 get_info()] --- link4_info
[2018-10-03 22:04:16,723 INFO     Thread-6 get_info()] --- link5_info
[2018-10-03 22:04:17,224 INFO     Thread-7 get_info()] --- link6_info
[2018-10-03 22:04:17,723 INFO     Thread-10 get_info()] --- link7_info
[2018-10-03 22:04:18,225 INFO     Thread-9 get_info()] --- link8_info
[2018-10-03 22:04:18,722 INFO     Thread-2 get_info()] --- link9_info
['link0_info', 'link1_info', 'link2_info', 'link3_info', 'link4_info', 
'link5_info', 'link6_info', 'link7_info', 'link8_info', 'link9_info']