Skip to content

Commit

Permalink
MAINT: Break reference cycle between algorithm and simulator
Browse files Browse the repository at this point in the history
when simulation finishes, so that resources are cleaned up
deterministically.
  • Loading branch information
richafrank committed Jun 3, 2016
1 parent cf1687e commit bcc1876
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 18 deletions.
15 changes: 0 additions & 15 deletions tests/test_examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from functools import partial
import gc
import tarfile

import matplotlib
Expand Down Expand Up @@ -54,20 +53,6 @@ def init_class_fixtures(cls):
serialization='pickle',
)

# We need to call gc.collect before tearing down our class because we
# have a cycle between TradingAlgorithm and AlgorithmSimulator which
# ultimately holds a reference to the pipeline engine passed to the
# tests here.

# This means that we're not guaranteed to have deleted our disk-backed
# resource readers (e.g. SQLiteAdjustmentReader) before trying to
# delete the tempdir, which causes failures on Windows because Windows
# doesn't allow you to delete a file if someone still has an open
# handle to that file.

# :(
cls.add_class_callback(gc.collect)

@parameterized.expand(examples.EXAMPLE_MODULES)
def test_example(self, example_name):
actual_perf = examples.run_example(
Expand Down
10 changes: 7 additions & 3 deletions zipline/gens/tradesimulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,9 +142,9 @@ def every_bar(dt_to_use, current_data=self.current_data,
for new_order in new_orders:
perf_tracker.process_order(new_order)

self.algo.portfolio_needs_update = True
self.algo.account_needs_update = True
self.algo.performance_needs_update = True
algo.portfolio_needs_update = True
algo.account_needs_update = True
algo.performance_needs_update = True

def once_a_day(midnight_dt, current_data=self.current_data,
data_portal=self.data_portal):
Expand Down Expand Up @@ -191,6 +191,10 @@ def handle_benchmark(date, benchmark_source=self.benchmark_source):
benchmark_source.get_value(date)

def on_exit():
# Remove references to algo, data portal, et al to break cycles
# and ensure deterministic cleanup of these objects when the
# simulation finishes.
self.algo = None
self.benchmark_source = self.current_data = self.data_portal = None

with ExitStack() as stack:
Expand Down

0 comments on commit bcc1876

Please sign in to comment.