dfc0efb79c
It came to my attention when I was deciding whether or not to use the jenkins_jobs.parallel.parallelize decorator to parallelize things in jenkins_jobs.parser that because it is using the Python threading library nothing is actually parallelized, only concurrentized (at least for CPython). I actually think concurrency is fine for the original use case since that (ie, updating Jenkins jobs) is primarily I/O bound on network connections to a Jenkins instance. However, the "parallel" name really is misleading and could actually be harmful for users of this API who may mistakenly have the impression that it can be used to speed up CPU-bound tasks. Also removes seemingly unnecessary usages of this decorator. ie, jenkins_jobs.builder.Jenkins.changed that is never actually calle with a list of arguments. Change-Id: I996f9dea440e2d6b67ea70870d22942d6eef3ec7
71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
# Copyright 2015 David Caro
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import time
|
|
from multiprocessing import cpu_count
|
|
|
|
from testtools import matchers
|
|
from testtools import TestCase
|
|
|
|
from jenkins_jobs.parallel import concurrent
|
|
from tests.base import mock
|
|
|
|
|
|
class TestCaseParallel(TestCase):
|
|
def test_parallel_correct_order(self):
|
|
expected = list(range(10, 20))
|
|
|
|
@concurrent
|
|
def parallel_test(num_base, num_extra):
|
|
return num_base + num_extra
|
|
|
|
parallel_args = [{'num_extra': num} for num in range(10)]
|
|
result = parallel_test(10, concurrent=parallel_args)
|
|
self.assertThat(result, matchers.Equals(expected))
|
|
|
|
def test_parallel_time_less_than_serial(self):
|
|
|
|
@concurrent
|
|
def wait(secs):
|
|
time.sleep(secs)
|
|
|
|
before = time.time()
|
|
# ten threads to make it as fast as possible
|
|
wait(concurrent=[{'secs': 1} for _ in range(10)], n_workers=10)
|
|
after = time.time()
|
|
self.assertThat(after - before, matchers.LessThan(5))
|
|
|
|
def test_parallel_single_thread(self):
|
|
expected = list(range(10, 20))
|
|
|
|
@concurrent
|
|
def parallel_test(num_base, num_extra):
|
|
return num_base + num_extra
|
|
|
|
parallel_args = [{'num_extra': num} for num in range(10)]
|
|
result = parallel_test(10, concurrent=parallel_args, n_workers=1)
|
|
self.assertThat(result, matchers.Equals(expected))
|
|
|
|
@mock.patch('jenkins_jobs.parallel.cpu_count', wraps=cpu_count)
|
|
def test_use_auto_detect_cores(self, mockCpu_count):
|
|
|
|
@concurrent
|
|
def parallel_test():
|
|
return True
|
|
|
|
result = parallel_test(concurrent=[{} for _ in range(10)],
|
|
n_workers=0)
|
|
self.assertThat(result, matchers.Equals([True for _ in range(10)]))
|
|
mockCpu_count.assert_called_once_with()
|