ad_group_init->tp_set_threadpool_size->io_poll_create->epoll_create
(2)关闭epoll
tp_end->thread_group_close->thread_group_destroy->close(pollfd)
(3)关联socket描述符
handle_event->start_io->io_poll_associate_fd->io_poll_start_read->epoll_ctl
(4)处理连接请求
handle_event->threadpool_process_request->do_command->dispatch_command->mysql_parse->mysql_execute_command
(5)工作线程空闲时
worker_main->get_event->pthread_cond_timedwait
等待thread_pool_idle_timeout后,退出。
(6)监听epoll
worker_main->get_event->listener->io_poll_wait->epoll_wait
(7)端口监听线程
main->mysqld_main->handle_connections_sockets->poll
one-connection-per-thread函数调用关系
(1) 工作线程等待请求
handle_one_connection->do_handle_one_connection->do_command->
my_net_read->net_read_packet->net_read_packet_header->net_read_raw_loop->
vio_read->vio_socket_io_wait->vio_io_wait->poll
备注:与线程池的工作线程有监听线程帮助其监听请求不同,one-connection-per-thread方式的工作线程在空闲时,会调用poll阻塞等待网络包过来;
而线程池的工作线程只需要专心处理请求即可,所以使用也更充分。
(2)端口监听线程
与线程池的(7)相同