لانچر ministro از ورژن 5.1 کیوت به بعد دیگه به صورت پیش فرض استفاده نمیشه و کتابخونه ها به برنامه اصلی لینک میشن.همین الان روی کیوت 5.2 بازی maroon که جزو مثالهای خود sdk هست رو کامپایل و روی اندروید تست کردم.فقط پروژه رو باز کردم build کردم و اجرا کردم هیچ کار اضافه ای نیاز نداشت.حجم apk نهایی هم 8.5 مگ شد.
event driven یک مفهوم کلی هست و خیلی جاها استفاده میشه و با روشهای مختلفی پیاده سازی میشه و در کیوت در قالب همون signal/slot پیاده شده.شاید یک مقایسه با twisted قضیه رو مشخص تر کنه.اولین کد مربوط به twisted هست که از صفحه اول سایتش برداشتم و دومی کد کوتاه شده ی برنامه fortune server از یکی از مثالهای فریمورک کیوت:
from twisted.internet import protocol, reactor
class Echo(protocol.Protocol):
def dataReceived(self, data):
self.transport.write(data)
class EchoFactory(protocol.Factory):
def buildProtocol(self, addr):
return Echo()
reactor.listenTCP(1234, EchoFactory())
reactor.run()
#include <QApplication>
#include <QtCore>
#include <stdlib.h>
#include "server.h"
Server::Server(QWidget *parent)
: QDialog(parent), tcpServer(0), networkSession(0)
{
//... deleted section
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendFortune()));
//... deleted section
}
void Server::sessionOpened()
{
//... deleted section
tcpServer = new QTcpServer(this);
if (!tcpServer->listen()) {
QMessageBox::critical(this, tr("Fortune Server"),
tr("Unable to start the server: %1.")
.arg(tcpServer->errorString()));
close();
return;
}
//... deleted section
}
void Server::sendFortune()
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << fortunes.at(qrand() % fortunes.size());
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection, SIGNAL(disconnected()),
clientConnection, SLOT(deleteLater()));
clientConnection->write(block);
clientConnection->disconnectFromHost();
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Server server;
server.show();
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
return app.exec();
}
در twisted خط آخر ()reactor.run رو داریم و در کیوت ;()return app.exec رو. اینجا جایی که event loop فعال میشه. در twisted در ازای برقراری کانکشن که یک event هست یک نمونه از کلاس Echo ساخته میشه و با رسیدن event بعدی یعنی رسیدن اطلاعات روی سوکت تابع dataReceived صدا زده میشه.
در کیوت شما این خط رو دارید:
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendFortune()));
اینجا جایی که شما event برقراری کانکشن رو به sendFortune متصل می کنین و در این تابع هم event دیسکانکت شدن کلاینت به deleteLater متصل شده که سوکت ایجاد شده رو بعد از دیسکانکت پاک می کنه.
از این مقایسه مشخصه که در کیوت هم بدون استفاده از thread مشابه همون روالی که در twisted طی میشه صورت می گیره.
در مورد عدد 80 هم حق با شماست و بهتر بود این عدد رو ذکر نمی کردم و فقط میگفتم تعداد زیادی از کتابخونه های پایتون bindingی برای کتابخونه های ++c/c هستن.البته من هدفم مطرح کردن چیز دیگه ای بود که شاید بهتر باشه باز برای اون مثال بزنم تا واضح تر بشه که البته خلاصه اش این میشه که پایتون(حداقل پیاده سازی فعلی اون) بدون ماژولهایی که با ++c/c برای اون نوشته شدن یک زبان غیر کاربردی خواهد بود به دلیل کند بودن! مثلا اینجا رو ببینین :
http://python.org/download/releases/3.3.3 که این خط مد نظر منه:
A C implementation of the "decimal" module, with up to 120x speedup for decimal-heavy applications
خب فکر نکنم نیاز به توضیح داشته باشه افزایش سرعت تا 120 برابر در ماژول decimal اتفاق افتاده اونم به خاطر اینکه پیاده سازی جدید با C هست نه خود پایتون!
اینقدر موقع نوشتن این مطلب درگیر کارای دیگه شدم که باز امکان داره چیزهای غیر دقیقی گفته باشم!
در ضمن یک خبر خوب هم اینه که در پایتون 3.4 ماژول asyncio به پایتون اضافه میشه(
http://docs.python.org/3.4/library/asyncio.html) که فکر کنم می تونه به عنوان جایگزینی برای twisted استفاده بشه.