Цикл в питоне не увеличивается должным образом - PullRequest
0 голосов
/ 26 апреля 2019

Я использую цикл for в Python с функцией диапазона (range(0,100000 ).

Внутри цикла я создаю поток, вызывающий некоторый метод для выполнения некоторой задачи, и передаю индекс цикла в качестве параметра целевой функции потока.

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

for index in range(0,100000):                                                         
    t=Thread(target=somefunction,args=(index,)                                  
    t.start()                                                                                                
    t.join()            

Внутри somefunction, я выполняю некоторую операцию, а также печатаю значение индекса. Печатается то же значение индекса. Это означает, что цикл не увеличивается должным образом. Пожалуйста, помогите

1 Ответ

0 голосов
/ 26 апреля 2019

Вы можете реализовать что-то вроде ниже, чтобы решить проблему. потоки будут запускать полную программу, поэтому цикл не увеличивается должным образом.

Здесь я использовал map (применить данную функцию к каждому элементу данной итерируемой), чтобы передать параметр функции

from multiprocessing.dummy import Pool as ThreadPool
import time
import datetime

def operation(value):
    # whatever operation needs to be performed
    print("{} : Thread no {}\n".format(datetime.datetime.now(),value))
    time.sleep(20)

# Data/tasks needs to be processed added in list
Data = [1,2,3,4,5,6,7,8,9]

# Creating pools 
c_pool = ThreadPool(5) # using 5 threads
c_pool.map(operation, Data) # using map method to perform operation
c_pool.close()
c_pool.join()

будет выполнять 5 задач / операцию одновременно.

Здесь 1-й 5 взят для процесса

2019-04-26 **12:47:37**.800258 : Thread no 1
2019-04-26 **12:47:37**.800258 : Thread no 2
2019-04-26 **12:47:37**.800258 : Thread no 3
2019-04-26 **12:47:37**.800258 : Thread no 4
2019-04-26 **12:47:37**.800258 : Thread no 5

Здесь отдых 5 начался через 20 секунд (time.sleep (20))

2019-04-26 **12:47:57**.809258 : Thread no 6
2019-04-26 **12:47:57**.809258 : Thread no 7
2019-04-26 **12:47:57**.809258 : Thread no 8
2019-04-26 **12:47:57**.809258 : Thread no 9
...