我正在尝试确定如何通过 asyncio 代码正确使用 cProfile 和 pstats。我正在通过运行来分析我的脚本cProfile.run('loop.run_until_complete(main())', 'profile.stats')
。
使用pstats
to 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) 我写了一个脚本,它有多个线程(用它创建threading.Thread
)从一个Queue
using中获取URL queue.get_nowait()
,然后处理HTML.我是多线程编程的新手,我很难理解queue.task_done()
函数的用途.
当Queue
为空时,它会自动返回queue.Empty
异常.所以我不明白每个线程需要调用该task_done()
函数.我们知道我们已经完成了队列的空白,所以为什么我们需要通知它工作线程已经完成了他们的工作(与队列有关,在他们从中获取了URL之后) ?
有人可以给我提供一个代码示例(理想情况下使用urllib
,文件I/O,或斐波那契数字以外的其他内容并打印"Hello"),它向我展示了如何在实际应用中使用此函数?
我正在尝试学习如何使用 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) 我正在编写一个网络爬虫,它为许多不同的域运行并行提取。我想限制对每个域发出的每秒请求数,但我不关心打开的连接总数,或者所有域中发出的每秒请求总数。我想最大限度地增加打开连接数和每秒请求数,同时限制对单个域的每秒请求数。
我可以找到的所有当前存在的示例 (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) 有没有办法使用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 ×5
asynchronous ×2
task ×2
aiohttp ×1
concurrency ×1
cprofile ×1
epoll ×1
nltk ×1
profiling ×1
queue ×1
random ×1
string ×1
vocabulary ×1