Как использовать ограничение времени ожидания в потоках - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу запустить чей-то SQL-запрос в новом потоке:

#!/usr/bin/env ruby

require 'mysql2'
require 'sequel'

CONF = {
  adapter: 'mysql2',
  encoding: 'utf8',
  username: 'ruby',
  password: 'ruby',
  host: 'localhost',
  port: 3306,
  pool: 4,
  read_timeout:     10,
  write_timeout:    10,
  connect_timeout:  10,
  pool_timeout:     10,
  database: 'demo',
  max_conns: 7
}

conn = Sequel.connect(CONF)

t = Thread.new { conn['select sleep(100)'].all }
sleep 2

t.kill
sleep 15

Когда я запускаю этот код, я ожидаю, что запрос остановится через 10 секунд, но это не так.При просмотре списка процессов mysql с помощью:

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' 

я вижу - он все еще обрабатывает (41 сек):

| TIME | QUERY             |  
|------|-------------------|
| 41   | select sleep(100) |

Как изменить мой код для получения ожидаемого результата?

1 Ответ

0 голосов
/ 19 декабря 2018

Параметры _timeout предназначены для TCPSocket, используемого клиентом, и не устанавливают максимальное время ожидания для результатов запроса.

Вы можете использовать Timeout из ruby ​​stdlib:

t = Thread.new do
  Timeout.timeout(10) do
    Sequel.connect(CONF)['select sleep(100)'].all
  end
end

Примечание: Timeout имеет широко известные проблемы, как показано здесь .

Вы также можете рассмотреть что-то вроде connection_pool gem , у которого есть тайм-аутфункция и сделает пул соединений для вас.

...