我正在将一些RSS源添加到App Engine中的数据存储区中,以便为iPhone应用程序提供服务.我使用cron来安排每x分钟更新一次RSS.每个任务只解析一个RSS源(有15-20个项目).我经常收到有关App Engine仪表板中高CPU使用率的警告,因此我正在寻找优化代码的方法.
目前,我使用minidom(因为它已经在App Engine上),但我怀疑它不是很有效!
这是代码:
dom = minidom.parseString(urlfetch.fetch(url).content)
if dom:
items = []
for node in dom.getElementsByTagName('item'):
item = RssItem(
key_name = self.getText(node.getElementsByTagName('guid')[0].childNodes),
title = self.getText(node.getElementsByTagName('title')[0].childNodes),
description = self.getText(node.getElementsByTagName('description')[0].childNodes),
modified = datetime.now(),
link = self.getText(node.getElementsByTagName('link')[0].childNodes),
categories = [self.getText(category.childNodes) for category in node.getElementsByTagName('category')]
);
items.append(item);
db.put(items);
def getText(self, nodelist):
rc = ''
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc = rc + node.data
return rc
Run Code Online (Sandbox Code Playgroud)
没有太多事情发生,但脚本通常需要2-6秒的CPU时间,这似乎有点过于循环20个项目和阅读一些属性.
我能做些什么来加快速度?上面的代码中有什么特别糟糕的,或者我应该改为另一种解析方式?是否有更好的库(适用于App Engine),或者我自己更好地解析RSS?
我正在阅读一些关于 Unicode 的问题,其中有一些我不完全理解的评论,例如:
Dean Harding:UTF-8是一种变长编码,处理起来比定长编码更复杂。另外,请参阅我对 Gumbo 答案的评论:基本上,所有编码(UTF-8、UTF-16 和 UTF-32)中都存在组合字符,并且它们需要特殊处理。您可以使用与组合字符相同的特殊处理来处理 UTF-16 中的代理项对,因此在大多数情况下您可以忽略代理项并将 UTF-16 视为固定编码。
我对最后一部分(“大部分”)有点困惑。如果UTF-16被视为固定的16位编码,这会导致什么问题?存在 BMP 之外的字符的可能性有多大?如果存在,如果您假设为两字节字符,这可能会导致什么问题?
我阅读了关于代孕者的维基百科信息,但它并没有真正让我更清楚事情!
编辑:我想我真正的意思是“为什么有人建议将 UTF-16 视为固定编码,而它看起来是假的?”
编辑2:
我在“ Is There Any Reasons to Preferred UTF-16 over UTF-8? ”中找到了另一条评论,我认为这更好地解释了这一点:
Andrew Russell:就性能而言:UTF-8 比 UTF-16 更难解码。在 UTF-16 中,字符要么是基本多语言平面字符(2 字节),要么是代理对(4 字节)。UTF-8 字符可以是 1 到 4 个字节之间的任意位置
这表明 UTF-16 不会有任何三字节字符,因此通过假设 16 位,您不会因减少一个字节而“完全搞砸”。但我仍然不相信这与假设 UTF-8 是单字节字符有什么不同!
我刚刚学习F#,在tryfsharp.org上玩的时候,我注意到如果我更改了这段代码:
[0..100]
|> List.sum
Run Code Online (Sandbox Code Playgroud)
至
["A"; "B"; "D"]
|> List.sum
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
The type 'string' does not support the operator 'get_Zero'
Run Code Online (Sandbox Code Playgroud)
(这是你可以在你的浏览器中运行/修改的脚本,虽然它似乎只适用于我的IE!)
当我检查List.sum的定义时 ; 它说类型必须有一个名为Zero的静态成员.这似乎解释了错误; 除了我无法在int上看到任何名为Zero的成员!
所以; 这个适用于整数的零成员在哪里?如果我输入int.,我也无法在intellisense中看到它,也不会在docs中看到它,因为int只是一个.NET System.Int32(它似乎没有静态Zero属性).
(注意:它确实在错误中说"运算符"而不是"成员";这可能是相关的;虽然List.sum定义只是说"成员").
我有一些代码可以创建一个像这样做一些缓慢工作的任务:
public static Task wait1()
{
return new Task(() =>
{
Console.WriteLine("Waiting...");
Thread.Sleep(10000);
Console.WriteLine("Done!");
});
}
Run Code Online (Sandbox Code Playgroud)
在实际实现中,Thread.Sleep实际上将是一个Web服务调用.我想改变方法的主体可以使用await(因此它在网络访问/休眠期间不消耗线程).我的第一次尝试(基于shotgun调试编译错误)是这样的:
public static Task wait2()
{
return new Task(async () =>
{
Console.WriteLine("Waiting...");
await Task.Delay(10000);
Console.WriteLine("Done!");
});
}
Run Code Online (Sandbox Code Playgroud)
然而; 这个任务似乎与第一个任务的行为不一样,因为当我在它上面调用.Wait()时; 它会立即返回.
下面是一个显示差异的完整示例(控制台应用程序)(应用程序将在第二个任务启动时立即结束).
我需要做什么,以便我可以调用启动和等待任务,恰好在其中使用await代码?任务排队并稍后由代理执行,因此任务不会自动启动至关重要.
class Program
{
static void Main(string[] args)
{
var w1 = wait1();
w1.Start();
w1.Wait(); // This waits 110 seconds
var w2 = wait2();
w2.Start();
w2.Wait(); // This returns immediately
}
public static Task wait1()
{
return new Task(() =>
{
Console.WriteLine("Waiting..."); …Run Code Online (Sandbox Code Playgroud) 有没有办法判断F#中的函数是否是尾递归的?
我试图解释它,但有些人似乎很挣扎,并且问是否有办法确认他们做了什么是尾递归.你有什么容易做的(除了试图让它溢出堆栈)以确认尾部响应(或不)(最好是在IDE中)?
(我试过Reflector,但是当我打开F#项目时它就崩溃了!)
我正在尝试为Visual Studio 2013编写测试适配器(我正在使用Update 1运行Premium,并且安装了VS SDK,因此我可以引用所有VS DLL).因为它可以解决原始内容文件而不是编译的dll/exe,所以我似乎需要创建一个ITestContainerDiscoverer.
我在网上发现了一些似乎实施了这些的公共回购; 例如:
然而; 我的代码看起来是相同的(和VS DLL相同的引用),但似乎永远不会触发.我放了File.Write,Console.WriteLine,Debuuger.Launch,还附加了另一个VS实例.这是我班级目前的样子:
[Export(typeof(ITestContainerDiscoverer))]
public class MyTestContainerDiscoverer : ITestContainerDiscoverer
{
[ImportingConstructor]
public MyTestContainerDiscoverer([Import(typeof(SVsServiceProvider))] IServiceProvider serviceProvider)
{
File.WriteAllText(@"M:\Coding\Applications\LuaTestAdapter\LuaTestAdapter\bin\Debug\Danny.txt", "TEST!");
Console.WriteLine("IT'S RUNNING!");
Debugger.Launch();
}
public Uri ExecutorUri
{
get { return TestExecutor.ExecutorUri; }
}
public IEnumerable<ITestContainer> TestContainers
{
get
{
return new[] {
new TestContainer(this, @"M:\TestProject\Test.lua")
};
}
}
public event EventHandler TestContainersUpdated;
}
Run Code Online (Sandbox Code Playgroud)
我在一个以.TestAdapter.dll结尾的DLL中构建它,并手动将其复制到C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions然后启动VS. VS正确加载TestAdapter,因为在同一个项目中,我的TestDiscoverer(当前包含DLL作为调试扩展)正在输出到控制台:
[FileExtension(".lua")]
[FileExtension(".dll")] …Run Code Online (Sandbox Code Playgroud) 我编写了一些支持VS2012 + VS2013的Visual Studio扩展.我想在其中使用F#; 我对目标运行时有点困惑......
我的目标是.NET 4.5(不是4.5.1),但我也可以选择F#3.0和3.1.我知道F#3.1附带VS2013(和.NET 4.5.1),所以我不确定是否:
(目标3.0没什么大不了的; 3.1中似乎没有大量数据;但了解这些事情的相关性会很有用).
我的Dockerfile包含:
EXPOSE 80
Run Code Online (Sandbox Code Playgroud)
然而,如果我运行图像,-P我无法连接到它.运行-p 80:80良好.
danny@linux:~$ sudo docker run -d -P dart-test
b3277a5483531f6dc23a1c807cf895103fd5333b603c1b4a352e07c9721f1a48
# Can't connect here
danny@linux:~$ curl http://localhost/
curl: (7) Failed to connect to localhost port 80: Connection refused
danny@linux:~$ sudo docker stop b3277
b3277
danny@linux:~$ sudo docker run -d -p 80:80 dart-test
dfe68699bfb33ce33e8e6e1953ac828b9d31209988df64e2627d9228758438ba
# Connects fine here
danny@linux:~$ curl http://localhost/
Hello, world!
danny@linux:~$
Run Code Online (Sandbox Code Playgroud) 在 Flutter 中,我想监听 websocket 断开连接事件,如何实现? 当应用程序进入后台时,websocket 连接将被删除,我仍然没有找到让它在后台继续运行的方法(有没有人有解决方案?),所以我必须检测 websocket 连接是否丢失或什么的,以便我失去连接时可以重新连接。如果有人知道如何实现这一点,请帮忙。
我正在尝试使用 FakeAsync 编写一个测试,但它似乎挂在我的awaits 上。这是一个精简的示例:
test('danny', () async {
await FakeAsync().run((FakeAsync async) async {
print('1');
final a = Future<bool>.delayed(const Duration(seconds: 5))
.then((_) => print('Delayed future completed!'))
.then((_) => true);
print('2');
async.elapse(const Duration(seconds: 30));
// Tried all this too...
// async.flushMicrotasks();
// async.flushTimers();
// async.elapse(const Duration(seconds: 30));
// async.flushMicrotasks();
// async.flushTimers();
// async.elapseBlocking(const Duration(seconds: 30));
print('3');
await a;
print('4');
expect(1, 2);
});
});
Run Code Online (Sandbox Code Playgroud)
此代码输出:
1
2
Delayed future completed!
3
// hangs and never prints '4'
Run Code Online (Sandbox Code Playgroud)
该async.elapse呼叫被允许完成未来,但它仍然挂起await …
.net ×5
f# ×3
async-await ×2
c# ×2
dart ×2
flutter ×2
.net-4.5 ×1
asynchronous ×1
docker ×1
f#-3.0 ×1
f#-scripting ×1
python ×1
unicode ×1
utf-16 ×1
websocket ×1