Почему Python переключает потоки?

Вы можете использовать событие CustomDrawSubItem.

В приведенном ниже примере игнорируется текст и рисуется прямоугольник. К сожалению, это немного хлопот, чтобы получить прямоугольник для правой колонки, но этот подход работает:

procedure TForm.ListViewCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  r : TRect;
  i : Integer;
begin
  r := Item.DisplayRect(drBounds);
  for i := 0 to SubItem-1 do begin
    r.Left := r.Left + ListView.Columns.Items[i].Width;
    r.Right := r.Left  + ListView.Columns.Items[i+1].Width;
  end;
  case SubItem of
     1 : ListView.Canvas.Pen.Color := clRed;
  else
    ListView.Canvas.Pen.Color := clBlue;
  end;

  ListView.Canvas.Rectangle(r.Left, r.Top, r.Right, r.Bottom);
  DefaultDraw := False;
end;
1
задан BHC 18 January 2019 в 15:21
поделиться

1 ответ

Поток не всегда имеет ввод / вывод. Можно было бы, чтобы один поток занимался обработкой чисел, другой обрабатывал ввод-вывод. Поток сокращения числа с вашим предложением никогда не будет отбрасывать GIL, чтобы другой поток мог обрабатывать ввод / вывод.

Чтобы обеспечить запуск каждого потока, поток по умолчанию отбросит GIL через 5 мс (Python 3), если он не сделал этого раньше из-за ожидания ввода-вывода .

Вы можете изменить этот интервал с помощью sys.setswitchinterval().

Threading - это простой метод параллелизма. Более эффективный метод параллелизма можно найти в asyncio , который предлагает однопоточный параллелизм с использованием сопрограмм.

0
ответ дан Darkonaut 18 January 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: