Как я могу заставить свои потоки успешно работать по смоделированным часам?Python

Программы на Python
Ответить
Anonymous
 Как я могу заставить свои потоки успешно работать по смоделированным часам?

Сообщение Anonymous »

У меня есть проект моделирования, который я выполняю на Python, в котором множество рабочих потоков пытаются выполнить задачи и отслеживают, сколько времени это занимает. Эти задачи приходят в разное время и блокируют разные ресурсы.
Для этого у меня есть по 1 потоку для каждого из воркеров и один поток, вся цель жизни которого — просто поддерживать след часов. Однако, несмотря на это, кажется, что рабочие потоки пропускают некоторые «секунды», отслеживаемые потоком часов.
Есть ли лучший способ сделать это, чтобы он не пропускал время? ?
Вот результат, который показывает переменную «all_time» (в данном случае мои часы) и пропускает некоторые значения.
I' Я пробовал использовать несколько рабочих потоков, и я пробовал с только один.
Я даже не знаю, как лучше сформулировать вопрос, поэтому, если у вас есть способ сформулировать вопрос получше, я буду рад его услышать.
Я даже не знаю, как лучше сформулировать вопрос.
p>
Текущая мощность:
WHO WHEN
0 WORKER0(0-14400) 0
1 WORKER0(0-14400) 1
2 WORKER0(0-14400) 2
3 WORKER0(0-14400) 3
4 WORKER0(0-14400) 6
5 WORKER0(0-14400) 11
6 WORKER0(0-14400) 12
7 WORKER0(0-14400) 15
8 WORKER0(0-14400) 17
9 WORKER0(0-14400) 18
10 WORKER0(0-14400) 21
11 WORKER0(0-14400) 24
12 WORKER0(0-14400) 26
13 WORKER0(0-14400) 27
14 WORKER0(0-14400) 29
15 WORKER0(0-14400) 30
16 WORKER0(0-14400) 31
17 WORKER0(0-14400) 32
18 WORKER0(0-14400) 33
19 WORKER0(0-14400) 35

ожидаемый результат:
WHO WHEN
0 WORKER0(0-14400) 0
1 WORKER0(0-14400) 1
2 WORKER0(0-14400) 2
3 WORKER0(0-14400) 3
4 WORKER0(0-14400) 4
5 WORKER0(0-14400) 5
6 WORKER0(0-14400) 6
7 WORKER0(0-14400) 7
8 WORKER0(0-14400) 8
9 WORKER0(0-14400) 9
10 WORKER0(0-14400) 10
11 WORKER0(0-14400) 11
12 WORKER0(0-14400) 12
13 WORKER0(0-14400) 13
14 WORKER0(0-14400) 14
15 WORKER0(0-14400) 15
16 WORKER0(0-14400) 16
17 WORKER0(0-14400) 17
18 WORKER0(0-14400) 18
19 WORKER0(0-14400) 19

Код:
import random
import threading
import time
import pandas as pd

stop_event = threading.Event()
clock_lock = threading.Condition()
clock_time = 0
all_time = 0
days_running = 1

issue_lock = threading.Condition()
issue_df = pd.DataFrame(columns = ["WHO","WHEN"])
##bus.emit("ISSUE", [who, what, where, when, why])

def clean_issue_list():
global issue_df
issue_df.drop_duplicates(inplace = True,ignore_index=True)
issue_df.sort_values(by = ["WHEN"], inplace = True,ignore_index=True)

from event_bus import EventBus

bus = EventBus()

@bus.on('ISSUE')
def issuehandler(msg):
global issue_list
global issue_df
issue_lock.acquire()
issue_df = pd.concat([pd.DataFrame([msg[:]], columns=issue_df.columns), issue_df], ignore_index=True)
issue_lock.release()

def worker(starttime,endtime,max_stack_height,efficiancy, startzone, allowed_zones = []): #thread? maybe?
global clock_time
global all_time
global taskqueue
global zonelist
who = threading.current_thread().name
current_task = None
current_zone = startzone
allowedtime = starttime #allowed time is the time its allowed to start working
#reset it to be the end time of its current task after every action
while not stop_event.is_set():
clock_lock.acquire()
now = all_time
clock_lock.release()
if now >= allowedtime and now < endtime: #get a task
clock_lock.acquire()
bus.emit("ISSUE", [who, all_time])
clock_lock.release()

def work_clock(): #make this a thread, have it just constantly update a clock over and over again
global clock_time
global all_time
global days_running
maxtime = 60*60*24
while not stop_event.is_set():
clock_lock.acquire()
clock_time+=1
all_time+=1
if clock_time >= maxtime:
clock_time = 0
days_running -= 1
if days_running

Подробнее здесь: https://stackoverflow.com/questions/792 ... ated-clock
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»