注:该文用于个人学习记录和知识交流,如有不足,欢迎指点。
客户端、服务器、Mysql服务器
- 客户端申请数据
- 服务器向Mysql发送数据的请求
- 服务器接收Mysql的数据
- 服务器回复给客户端
服务器向Mysql请求数据的三种编程方式
1. 同步
cpp
int main()
{
mysql_query(mysql_fd);
mysql_recv(mysql_fd);
parse_data(buf);
send(client_fd);
mysql_query(mysql_fd);
mysql_recv(mysql_fd);
parse_data(buf);
send(client_fd);
....
other();
}
2. 线程
cpp
handle()
{
mysql_query(mysql_fd);
mysql_recv(mysql_fd);
parse_data(buf);
send(client_fd);
}
int main()
{
for(n)
{
pthread_create(handle);
}
other();
}
3. 协程
cpp
handle()
{
mysql_query(mysql_fd);
mysql_recv(mysql_fd);
parse_data(buf);
nty_send(client_fd);
}
schedule_run()
{
// 调度协程
....
}
int main()
{
hook_init(); // 把mysql_query内部的io都弄成协程式的io(可在协程函数间切换)
for(n)
{
coroutine_create(handle);
}
pthread_create(schedule_run);
other();
}
注意:可以通过hook来实现将send、recv等io操作函数都搞成协程式的io(包括mysql中的io操作函数),这样子mysql内部封装的io函数也可以定位到当前协程函数,进而进行切换。
(如果定位不到,则默认传统io)
总结:
- 多线程和多协程都是同步的编程方式,同时有异步的性能(线程或协程遇到阻塞CPU就会切换到另一个线程或协程)。
- 区别在于多协程只占用一个线程,一个协程创建的消耗(KB级别)远小于一个线程的消耗(MB级)