для python 3.6, у меня сработало следующее: запусти cmd.exe в качестве администратора
pip install numpy-1.13.0+mkl-cp36-cp36m-win32
pip install scipy-0.19.1-cp36-cp36m-win32
Вы можете использовать условную переменную . Попросите ваши рабочие потоки ждать переменной условия. Когда задание добавляется в любую из очередей заданий, сигнализируйте переменную условия. Затем, когда рабочий поток просыпается, он проверяет очереди, в которых он ожидает. Если у кого-то из них есть работа, он снимает ее с очереди. В противном случае он возвращается к ожиданию переменной условия. Ожидание переменной условия переводит поток в спящий режим, поэтому он не потребляет процессорное время.
Само собой разумеется, что вы должны защищать все обращения к очередям заданий с помощью мьютекса (например, pthread_mutex_t
]).
Как насчет:
Если для каждой очереди не слишком много рабочих, вы можете создать переменную условия для каждого рабочего.
Я бы использовал boost :: asio для постановки данных в очередь, чтобы ваши многочисленные потоки могли это сделать. Вы можете передать ссылку в очередь с помощью команды post и соответствующим образом обработать поток.
Вместо того, чтобы иметь отдельную блокировку для каждой очереди, почему бы не иметь одну блокировку для всей очереди?
Предполагая, что удаление из очереди занимает незначительное время (так что блокировка удерживается только в течение незначительного времени), может не потребоваться более одной блокировки.
Вы можете сделать что-то вроде этого: каждое задание имеет связанную с ним «очередь». Например:
Допустим, у вас 2 очереди. Ваша работа могла бы сказать:
job[0].queue = 1; /* That job is in queue 1 */
job[1].queue = 1;
job[2].queue = 2; /* this job is in queue 2 */
...
etc
Итак, у вас есть «мешок с нитками». Поток просто выбирает работу - скажем, job [2]. Если этому потоку разрешено обрабатывать задания только из очереди 1, то он помещает это задание обратно в очередь готовности и выбирает другое задание.
Таким образом, каждый поток знает, какие очереди ему разрешено обрабатывать, и когда он выбирает задание. , он проверяет соответствие поля «очередь» задания. Если это не так, он выбирает другое задание.
(во многих отношениях планирование процессов работает в Linux на нескольких ядрах. У каждого процесса есть битовая маска, указывающая, на каких процессорах ему разрешено работать, а затем процессор перед тем, как сделать это, убедитесь, что этот процесс «разрешен».
Похоже, вам следует использовать boost :: thread , boost :: condition и std :: queue .