JRazor
@JRazor
Senior StarkOverFlow Programmer

Python threading: как заблокировать выполнение, пока не выполнятся все потоки?

Приветствую всех.

Есть класс, назовем его Caller. Он является частью модуля и осуществляет запросы по HTTP. Каждый instance класса может осуществлять одно действие за раз.

То есть:
client = Caller(API_KEY, API_SECRET, bla-bla)

То есть один клиент - это будет один instance класса Caller.

Допустим я хочу, чтобы эта функция выполнялась в N потоков. Допустим их будет 10. Окей, создаем 10 instance и работаем в 10 потоков. Все работает. Но, предположим, что потоков 10, а действий которые нужно будет совершить - 20. Значит каждый instance проработает два раза. И тут незадача - нужно заблокировать следующие потоки, пока предыдущие не будут выполнены. Неизвестно, какой instance освободился и какому давать следующее задание.

Если ничего не блокировать, имеем определенную ошибку SSL сертификата, которая обычно означает, что соединение уже занято.

Собственно, можно это все "накостылять" через открытые/закрытые instance, но я думаю, что есть решение изящнее и правильнее.

Пытался сделать так, блокировка не происходит (функция chunks делит все потоки на определенные части по количеству существующих instance): 8254a53a9c874dadb76ec5bbe3c74101.png
  • Вопрос задан
  • 513 просмотров
Пригласить эксперта
Ответы на вопрос 1
@asd111
Насколько я понял вы хотите создать пул потоков и потом его использовать.
Для этого есть threading pool.

пример:
import urllib2
from multiprocessing.dummy import Pool as ThreadPool

urls = [
	'http://www.python.org',
	'http://www.python.org/about/',
	'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html',
	'http://www.python.org/doc/',
	'http://www.python.org/download/',
	'http://www.python.org/getit/',
	'http://www.python.org/community/',
	'https://wiki.python.org/moin/',
	'http://planet.python.org/',
	'https://wiki.python.org/moin/LocalUserGroups',
	'http://www.python.org/psf/',
	'http://docs.python.org/devguide/',
	'http://www.python.org/community/awards/'
	# etc.. 
	]

# Пул из 10 потоков
pool = ThreadPool(10)

# Запускаем функцию urlopen в 10 потоков
# на массиве urls
results = pool.map(urllib2.urlopen, urls)

#Ждём завершения всех потоков
pool.close()
pool.join()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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