新的Mono Continuations/Tasklet框架的主要性能开销(gc/stack复制......)是什么?
这个开销(协程性能/原始性能)与其他框架(如Lua Coroutine和无堆栈python)相比如何?
在Mono 2.6中将添加延续/协程支持.我构建了一个svn版本并使用以下代码来估计其开销
static void Main()
{
Console.WriteLine("starting.,..");
for(int i = 0; i < 10000; i++)
{
MicroThread t1 = new MicroThread(Run1);
t1.Start();
}
Scheduler.Run();
Console.WriteLine("starting raw loop.,..");
int x = 2;
for (int i = 0; i < 10000 * 400; i++ )
{
x++;
}
Console.WriteLine("1finished.,.. " + x.ToString());
Console.ReadLine();
}
static void Run1()
{
for (int y = 0; y < 400; y++)
{
MicroThread.CurrentThread.Yield();
}
}
Run Code Online (Sandbox Code Playgroud)
微线程/调度程序运行大约需要1.5-2秒,而原始循环几乎是不稳定的.虽然预计会有开销,但这似乎有点多.
新的Mono Continuations/Tasklet框架的主要性能开销是什么?这个开销(协程性能/原始性能)与其他框架(如Lua Coroutine和无堆栈python)相比如何?
谢谢
我编写了一个漂亮的多线程脚本,当我运行它时,它使用25个线程比直接调用线程处理程序更糟糕.
然后我发现了全局解释器锁.我想问一下,在我丢弃这个脚本的python并重写其他东西之前,有没有办法在python中进行实际的多线程处理?
我已经对Stackless Python的tasklets进行了大量的谷歌研究.每个来源都提到它作为一个主题
但是,tasklet并不简洁.它们执行部分代码.
像这样的代码:
def function(n):
print n
print n
stackless.schedule()
stackless.tasklet(function)(3)
stackless.tasklet(function)(10)
stackless.run()
Run Code Online (Sandbox Code Playgroud)
会打印
3
3
10
10
Run Code Online (Sandbox Code Playgroud)
tasklet执行代码直到遇到stackless.schedule()然后它从开始或从最后一次暂停的位置开始执行下一个tasklet.
每个程序员都知道"没有GOTO"的黄金法则.我的问题是:
这和GOTO有什么不同?
如果没有并行执行tasklet,有什么好处?
为什么每个消息来源都提到它们作为线程替代品,如果它们不是真正的线程?
所以我在两台不同的机器上使用Python Stackless with heapy,它们具有相同的架构,但C编译器略有不同.Heapy在第一个上运行得非常好,但是我在第二个上获得了核心转储.
Python 2.7.1 Stackless 3.1b3 060516 (release27-maint, Jul 20 2011, 13:26:38)
[GCC 3.4.3 (MontaVista 3.4.3-25.0.116.0601565 2006-09-20)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from guppy import hpy;
>>> h=hpy()
>>> h.heap()
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
我不知道如何解决这个问题.任何建议赞赏.
如果你想知道,这是它在另一个有效的外观:
Python 2.7.1 Stackless 3.1b3 060516 (python-2.71:88862M, Jul 21 2011, 16:57:52)
[GCC 3.4.6 20060404 (Red Hat 3.4.6-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from guppy import hpy;
>>> h=hpy()
>>> …Run Code Online (Sandbox Code Playgroud) 我试图找到关于套接字编程的例子并且发现了这个脚本:http: //stacklessexamples.googlecode.com/svn/trunk/examples/networking/mud.py
通过这个脚本阅读我发现这一行:listenSocket.listen(5)
据我所知 - 它从缓冲区读取5个字节,然后用它做东西......
但如果另一端发送超过5个字节会发生什么?
在该脚本的另一个位置,它根据4个命令检查输入,并查看字符串中是否有\ r \n.不要像"look"加上\ r \n这样的命令弥补超过5个字节?
艾伦