New, much faster worker task sorting
This commit is contained in:
parent
29346cdef5
commit
66a950a481
5 changed files with 241 additions and 21 deletions
92
src/Test/TestWorkerTaskManager.py
Normal file
92
src/Test/TestWorkerTaskManager.py
Normal file
|
@ -0,0 +1,92 @@
|
|||
import pytest
|
||||
|
||||
from Worker import WorkerTaskManager
|
||||
from . import Spy
|
||||
|
||||
|
||||
class TestUiWebsocket:
|
||||
def checkSort(self, tasks): # Check if it has the same order as a list sorted separately
|
||||
tasks_list = list(tasks)
|
||||
tasks_list.sort(key=lambda task: task["id"])
|
||||
assert tasks_list != list(tasks)
|
||||
tasks_list.sort(key=lambda task: (0 - (task["priority"] - task["workers_num"] * 10), task["id"]))
|
||||
assert tasks_list == list(tasks)
|
||||
|
||||
def testAppendSimple(self):
|
||||
tasks = WorkerTaskManager.WorkerTaskManager()
|
||||
tasks.append({"id": 1, "priority": 15, "workers_num": 1, "inner_path": "file1.json"})
|
||||
tasks.append({"id": 2, "priority": 1, "workers_num": 0, "inner_path": "file2.json"})
|
||||
tasks.append({"id": 3, "priority": 8, "workers_num": 0, "inner_path": "file3.json"})
|
||||
assert [task["inner_path"] for task in tasks] == ["file3.json", "file1.json", "file2.json"]
|
||||
|
||||
self.checkSort(tasks)
|
||||
|
||||
def testAppendMany(self):
|
||||
tasks = WorkerTaskManager.WorkerTaskManager()
|
||||
for i in range(1000):
|
||||
tasks.append({"id": i, "priority": i % 20, "workers_num": i % 3, "inner_path": "file%s.json" % i})
|
||||
assert tasks[0]["inner_path"] == "file39.json"
|
||||
assert tasks[-1]["inner_path"] == "file980.json"
|
||||
|
||||
self.checkSort(tasks)
|
||||
|
||||
def testRemove(self):
|
||||
tasks = WorkerTaskManager.WorkerTaskManager()
|
||||
for i in range(1000):
|
||||
tasks.append({"id": i, "priority": i % 20, "workers_num": i % 3, "inner_path": "file%s.json" % i})
|
||||
|
||||
i = 333
|
||||
task = {"id": i, "priority": i % 20, "workers_num": i % 3, "inner_path": "file%s.json" % i}
|
||||
assert task in tasks
|
||||
|
||||
tasks.remove(task)
|
||||
|
||||
assert task not in tasks
|
||||
|
||||
self.checkSort(tasks)
|
||||
|
||||
def testModify(self):
|
||||
tasks = WorkerTaskManager.WorkerTaskManager()
|
||||
for i in range(1000):
|
||||
tasks.append({"id": i, "priority": i % 20, "workers_num": i % 3, "inner_path": "file%s.json" % i})
|
||||
|
||||
task = tasks[333]
|
||||
task["priority"] += 10
|
||||
|
||||
with pytest.raises(AssertionError):
|
||||
self.checkSort(tasks)
|
||||
|
||||
with Spy.Spy(tasks, "indexSlow") as calls:
|
||||
tasks.updateItem(task)
|
||||
assert len(calls) == 1
|
||||
|
||||
assert task in tasks
|
||||
|
||||
self.checkSort(tasks)
|
||||
|
||||
# Check reorder optimization
|
||||
|
||||
with Spy.Spy(tasks, "indexSlow") as calls:
|
||||
tasks.updateItem(task, "priority", task["priority"] + 10)
|
||||
assert len(calls) == 0
|
||||
|
||||
self.checkSort(tasks)
|
||||
|
||||
def testIn(self):
|
||||
tasks = WorkerTaskManager.WorkerTaskManager()
|
||||
|
||||
i = 1
|
||||
task = {"id": i, "priority": i % 20, "workers_num": i % 3, "inner_path": "file%s.json" % i}
|
||||
|
||||
assert task not in tasks
|
||||
|
||||
|
||||
def testFindTask(self):
|
||||
tasks = WorkerTaskManager.WorkerTaskManager()
|
||||
for i in range(1000):
|
||||
tasks.append({"id": i, "priority": i % 20, "workers_num": i % 3, "inner_path": "file%s.json" % i})
|
||||
|
||||
assert tasks.findTask("file999.json")
|
||||
assert not tasks.findTask("file-unknown.json")
|
||||
tasks.remove(tasks.findTask("file999.json"))
|
||||
assert not tasks.findTask("file999.json")
|
Loading…
Add table
Add a link
Reference in a new issue