![]()
A thread, sometimes called an execution context or a lightweight process, is a single sequential flow of control within a program. You use threads to isolate tasks. Each thread is a sequential flow of control within the same program. Each thread runs independently from the others, but at the same time.
We want to run a certain function a specified number of times per second. A class should be given such a function and some parameters, like the maximum number of threads, the number of active threads per second and a total duration.
import threading, time
class Fire:
def soldier(self, soldier_nr):
while (1):
self.work_lock.acquire()
if (self.still_working):
self.write_lock.acquire()
self.nr_active_soldiers += 1
self.write_lock.release()
start_time_counter = self.time_counter
self.function.__call__(self.arguments)
end_time_counter = self.time_counter
self.write_lock.acquire()
self.nr_active_soldiers -= 1
self.statistics.append((soldier_nr, start_time_counter, end_time_counter))
self.write_lock.release()
else:
break;
def __init__(self, function, arguments, nr_threads, per_second, duration):
self.function = function
self.arguments = arguments
self.nr_threads = nr_threads
self.per_second = per_second
self.duration = duration
self.work_lock = threading.Semaphore(0)
self.write_lock = threading.Semaphore(1)
self.still_working = 1
self.nr_active_soldiers = 0
self.time_counter = 0
self.statistics = []
def fire(self):
print 'Start'
for i in range(self.nr_threads):
thread1 = threading.Thread(target=self.soldier, args=(i, ))
thread1.start()
for second in range(self.duration):
for i in range(self.per_second):
self.work_lock.release()
self.write_lock.acquire()
if (len(self.statistics) > 0):
(soldier_nr, start_time_counter, end_time_counter) = self.statistics[-1]
delta_time = end_time_counter - start_time_counter
else:
delta_time = -1
print 'Active', self.nr_active_soldiers, 'Time', delta_time
self.write_lock.release()
time.sleep(1)
self.time_counter += 1
self.still_working = 0
for i in range(self.nr_threads):
self.work_lock.release()
time.sleep(5)
output_file = open('output.txt', 'wb')
for statistic in self.statistics:
output_file.write(str(statistic) + 'n')
output_file.close()
print 'End'
if (__name__ == '__main__'):
def waste_time(arguments):
time.sleep(2.5)
nr_threads = 20
per_second = 3
duration = 15
firing_squad = Fire(waste_time, None, nr_threads, per_second, duration)
firing_squad.fire()