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

У меня проблемы с написанием тестового кода на python с использованием потоков.Я смог заставить мои потоки работать, но я не могу заставить свой объект возвращать значение.Я хочу взять значения и добавить их в список, чтобы я мог рассчитать флопы.

создать класс для выполнения потоков

class myThread(threading.Thread):

    def calculation(self):
        n=0
        start=time.time()
        ex_time=0
        while ex_time < 30:
            n+=1
            end=time.time()
            ex_time=end-start
        return ex_time 


    def run(self): 
        t = threading.Thread(target = self.calculation)
        t.start()

функция для создания потоков

def make_threads(num):
    times=[]
    calcs=[]
    for i in range(num):
        print('start thread', i+1)
        thread1=myThread()
        t=thread1.start()
        times.append(t)
     #calcs.append(n)
    #when trying to get a return value it comes back as none as seen
    print(times)
#average out the times,add all the calculations to get the final numbers
#to calculate flops
    time.sleep(32) #stop the menu from printing until calc finish


def main():

    answer=1
    while answer != 0:
        answer=int(input("Please indicate how many threads to use: (Enter     0 to exit)"))
        print("\n\nBenchmark test with ", answer, "threads")
        make_threads(answer)

main()

1 Ответ

0 голосов
/ 27 ноября 2018

Два способа сделать это:

1.Использование статических переменных (хакерских, но эффективных и быстрых)

Определите некоторую глобальную переменную, которой вы затем манипулируете в потоке.Т.е.:

import threading
import time

class myThread(threading.Thread):

    def calculation(self):
        n=0
        start=time.time()
        ex_time=0
        print("Running....")
        while ex_time < 30:
            n+=1
            end=time.time()
            ex_time=end-start

        self.myThreadValues[self.idValue] = ex_time
        print(self.myThreadValues)
        return ex_time 

    def setup(self,myThreadValues=None,idValue=None):
        self.myThreadValues = myThreadValues
        self.idValue = idValue


    def run(self): 
        self.calculation()
        #t = threading.Thread(target = self.calculation)
        #t.start()

def make_threads(num):
    threads=[]
    calcs=[]
    myThreadValues = {}

    for i in range(num):
        print('start thread', i+1)
        myThreadValues[i] = 0
        thread1=myThread()
        thread1.setup(myThreadValues,i)
        thread1.start()
        #times.append(t)
        threads.append(thread1)

    # Now we need to wait for all the threads to finish. There are a couple ways to do this, but the best is joining.

    print("joining all threads...")
    for thread in threads:
        thread.join()

    #calcs.append(n)
    #when trying to get a return value it comes back as none as seen

    print("Final thread values: " + str(myThreadValues))
    print("Done")
    #average out the times,add all the calculations to get the final numbers
    #to calculate flops
    #time.sleep(32) #stop the menu from printing until calc finish

def main():

    answer=1
    while answer != 0:
        answer=int(input("Please indicate how many threads to use: (Enter     0 to exit)"))
        print("\n\nBenchmark test with ", answer, "threads")
        make_threads(answer)

main()

2.Надлежащим способом сделать это является использование процессов

. Процессы предназначены для передачи информации назад и вперед по сравнению с потоками, которые обычно используются для асинхронной работы.См. Объяснение здесь: https://docs.python.org/3/library/multiprocessing.html

См. Этот ответ: Как восстановить возвращаемое значение функции, переданной в multiprocessing.Process?

import multiprocessing
from os import getpid

def worker(procnum):
    print 'I am number %d in process %d' % (procnum, getpid())
    return getpid()

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes = 3)
    print pool.map(worker, range(5))
...