小编J. *_*lor的帖子

将 cProfile 与 asyncio 代码一起使用的正确方法是什么?

我正在尝试确定如何通过 asyncio 代码正确使用 cProfile 和 pstats。我正在通过运行来分析我的脚本cProfile.run('loop.run_until_complete(main())', 'profile.stats')

使用pstatsto sort by 后SortKeys.TIME,我得到以下输出:

In [9]: sorted_stats.print_stats()
Fri Feb 15 14:40:18 2019    profile.txt

         67411199 function calls (67230882 primitive calls) in 305.899 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     3617  273.162    0.076  273.162    0.076 {method 'poll' of 'select.epoll' objects}
14094092/14093931    1.527    0.000    1.904    0.000 {built-in method builtins.isinstance}
    44901    1.166    0.000    1.166    0.000 {built-in method posix.stat}
   784052    1.028    0.000    1.479    0.000 /usr/lib/python3/dist-packages/soupsieve/util.py:41(lower)
    32070    0.887    0.000 …
Run Code Online (Sandbox Code Playgroud)

python profiling epoll cprofile python-asyncio

8
推荐指数
1
解决办法
2182
查看次数

Python - queue.task_done()用于什么?

我写了一个脚本,它有多个线程(用它创建threading.Thread)从一个Queueusing中获取URL queue.get_nowait(),然后处理HTML.我是多线程编程的新手,我很难理解queue.task_done()函数的用途.

Queue为空时,它会自动返回queue.Empty异常.所以我不明白每个线程需要调用该task_done()函数.我们知道我们已经完成了队列的空白,所以为什么我们需要通知它工作线程已经完成了他们的工作(与队列有关,在他们从中获取了URL之后) ?

有人可以给我提供一个代码示例(理想情况下使用urllib,文件I/O,或斐波那契数字以外的其他内容并打印"Hello"),它向我展示了如何在实际应用中使用此函数?

python queue task

7
推荐指数
4
解决办法
4229
查看次数

如何在 asyncio 中并发运行任务?

我正在尝试学习如何使用 Python 的 asyncio 模块同时运行任务。在下面的代码中,我有一个模拟的“网络爬虫”作为示例。基本上,我试图让它在任何给定时间发生最多两个活动的 fetch() 请求,并且我希望在 sleep() 期间调用 process() 。

import asyncio

class Crawler():

    urlq = ['http://www.google.com', 'http://www.yahoo.com', 
            'http://www.cnn.com', 'http://www.gamespot.com', 
            'http://www.facebook.com', 'http://www.evergreen.edu']

    htmlq = []
    MAX_ACTIVE_FETCHES = 2
    active_fetches = 0

    def __init__(self):
        pass

    async def fetch(self, url):
        self.active_fetches += 1
        print("Fetching URL: " + url);
        await(asyncio.sleep(2))
        self.active_fetches -= 1
        self.htmlq.append(url)

    async def crawl(self):
        while self.active_fetches < self.MAX_ACTIVE_FETCHES:
            if self.urlq:
                url = self.urlq.pop()
                task = asyncio.create_task(self.fetch(url))
                await task
            else:
                print("URL queue empty")
                break;

    def process(self, page):
        print("processed page: " …
Run Code Online (Sandbox Code Playgroud)

python concurrency asynchronous task python-asyncio

7
推荐指数
1
解决办法
7534
查看次数

aiohttp:按域限制每秒请求数

我正在编写一个网络爬虫,它为许多不同的域运行并行提取。我想限制对每个域发出的每秒请求数,但我不关心打开的连接总数,或者所有域中发出的每秒请求总数。我想最大限度地增加打开连接数和每秒请求数,同时限制对单个域的每秒请求数。

我可以找到的所有当前存在的示例 (1) 限制打开的连接数或 (2) 限制在 fetch 循环中每秒发出的请求总数。例子包括:

他们都没有做我所要求的,即在每个域的基础上限制每秒请求数。第一个问题只回答如何限制每秒请求数。第二个甚至没有对实际问题的答案(OP 询问每秒请求数,答案都在谈论限制连接数)。

这是我尝试的代码,使用我为同步版本制作的简单速率限制器,当 DomainTimer 代码在异步事件循环中运行时,它不起作用:

from collections import defaultdict
from datetime import datetime, timedelta
import asyncio
import async_timeout
import aiohttp
from urllib.parse import urlparse
from queue import Queue, Empty

from HTMLProcessing import processHTML
import URLFilters

SEED_URLS = ['http://www.bbc.co.uk', 'http://www.news.google.com']
url_queue = Queue()
for u in SEED_URLS:
    url_queue.put(u)

# number of pages to download per run of crawlConcurrent()
BATCH_SIZE = 100
DELAY = timedelta(seconds = 1.0) # delay …
Run Code Online (Sandbox Code Playgroud)

python asynchronous rate-limiting python-asyncio aiohttp

5
推荐指数
1
解决办法
1525
查看次数

使用NLTK/Python生成N个随机英文单词的字符串

有没有办法使用NLTK/Python生成N个随机英文单词的字符串?

我知道 NLTK 能够根据输入文本和语法生成句子,但我不需要根据任何类型的语法生成句子 - 我只需要从给定的字典/词汇中随机选择 N 个单词,然后连接他们成一个字符串。我还知道生成随机字符串的能力或如何使用 NLTK 使用 n-gram 生成“看起来像英语”的无意义单词,但我需要这些单词是某个字典文件中的实际英语单词。

我尝试这样做:

from nltk.corpus import words
from random import sample

n = 100
rand_words = ' '.join(sample(words, n))
Run Code Online (Sandbox Code Playgroud)

words不是可迭代的,所以我不能这样使用它。使用 NLTK 的内置词典创建随机英语单词字符串的正确方法是什么?

python string random vocabulary nltk

1
推荐指数
1
解决办法
4557
查看次数