Mod Подключаем MySql

Тема в разделе "Готовые работы", создана пользователем Garry599, 10 мар 2013.

  1. StaleCracker

    StaleCracker

    Регистрация:
    19 фев 2011
    Гугли std::thread и аналоги. Пили менеджмент своих сообщений.

    Я с sql не работал, но будет что-то вроде:
    Код:
    #include "thread"
    #include "mutex"
     
    vector<reqest> ReadyReq; // Обработанные
    mutex ReadyReq_mut;
     
    vector<reqest> WaitReq;  // Ожидающие обработки
    mutex WaitReq_mut;
     
    bool	ExitThread;
    mutex ExitThread_mut;
     
    void SqlThread( )
    {
    	BD* Bd = CreateBD();
    	bool isContinue = true;
    	while( isContinue )
    	{
    		 ExitThread_mut.lock();
    		 isContinue = !ExitThread;
    		 ExitThread_mut.unlock();
    		 if( !isContinue )
    			break;
    		reqest* req = NULL;
    		WaitReq_mut.lock();
    		req = WaitReq.At(0);
    		if( req )
    			WaitReq.erase( 0 );
    		WaitReq_mut.unlock();
     
    		if( !req )
    			std::this_thread::sleep_for(1s);
    		else
    		{
    			Bd.check( reqest );
    	  
    			ReadyReq_mut.lock();
    			ReadyReq.push_back( reqest );
    			ReadyReq_mut.unlock();
    		}
    	}
    	// Чистим все
    	ReleaseBD( bd );
    }
     
    void AddReqestBD( reqest* req  )
    {
    	 WaitReq_mut.lock();
    	 WaitReq.push_back( reqest );
    	 WaitReq_mut.unlock();
    }
     
    reqest* CheckReqest(  )
    { 
    	  reqest* req = NULL;
    	 ReadyReq_mut.lock();
    	  // Ищем нужный, записываем его в реквест, удаляем с вектора обработанных.
    	 ReadyReq_mut.unlock();
    	return req;
    )
     
    void StartBDThread( )
    {
    	 thread myThread(SqlThread);
    }
    Собственно на финише нужно убивать этот процесс, через ExitThread, лучше заджойниться с ним после установки переменной, и дождаться пока он закочит работу.
    Medvedev нравится это.
  2. Brightside

    Brightside

    Регистрация:
    2 июн 2013
    Можно делать временные таблицы с ENGINE MEMORY, откуда потом выгребать все в нужные таблицы в InnoDB любым обработчиком. Можно писать все в обычные файлы, из которых потом неспеша делать
    Код:
    LOAD DATA INFILE 'data.txt' INTO TABLE table;
    в нужные таблицы.

    В ситуации, когда дисковый массив сервера зачастую работает "на бобинах", и данные пачками инсертятся в MySQL myisam/innodb, то при большом количестве данных в таблицах и большом количестве одновременных операций все может завалиться. Это будет вдвойне невесело, если MySQL расположен на том же сервере, где работает фолач, потому что задержки в работе дисковой системы при нагрузках могут блокировать много CPU.

    Можно использовать какой-нибудь Redis как временное высокопроизводительное хранилище для временных данных, а потом выгребать и обрабатывать их в MySQL, расположенном на другом сервере, любым удобным способом с помощью воркера.

Поделиться этой страницей