Skip to content

Commit 16b1443

Browse files
committed
Remove GIL acquisition from core operators
1 parent c390fa8 commit 16b1443

4 files changed

Lines changed: 22 additions & 91 deletions

File tree

src/Bonsai.Scripting.Python/Eval.cs

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,9 @@ public class Eval : Combinator<PyObject>
4444
/// </returns>
4545
public override IObservable<PyObject> Process<TSource>(IObservable<TSource> source)
4646
{
47-
return RuntimeManager.RuntimeSource.SelectMany(runtime =>
48-
{
49-
return source.Select(_ =>
50-
{
51-
using (Py.GIL())
52-
{
53-
var module = Module ?? runtime.MainModule;
54-
return module.Eval(Expression);
55-
}
56-
});
57-
});
47+
return RuntimeManager.RuntimeSource
48+
.GetModuleOrDefaultAsync(Module)
49+
.SelectMany(module => source.Select(_ => module.Eval(Expression)));
5850
}
5951

6052
/// <summary>
@@ -69,13 +61,7 @@ public override IObservable<PyObject> Process<TSource>(IObservable<TSource> sour
6961
/// </returns>
7062
public IObservable<PyObject> Process(IObservable<PyModule> source)
7163
{
72-
return source.Select(module =>
73-
{
74-
using (Py.GIL())
75-
{
76-
return module.Eval(Expression);
77-
}
78-
});
64+
return source.Select(module => module.Eval(Expression));
7965
}
8066

8167
/// <summary>
@@ -90,13 +76,7 @@ public IObservable<PyObject> Process(IObservable<PyModule> source)
9076
/// </returns>
9177
public IObservable<PyObject> Process(IObservable<RuntimeManager> source)
9278
{
93-
return source.Select(runtime =>
94-
{
95-
using (Py.GIL())
96-
{
97-
return runtime.MainModule.Eval(Expression);
98-
}
99-
});
79+
return source.Select(runtime => runtime.MainModule.Eval(Expression));
10080
}
10181
}
10282
}

src/Bonsai.Scripting.Python/Exec.cs

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,9 @@ public class Exec : Combinator<PyModule>
4545
/// </returns>
4646
public override IObservable<PyModule> Process<TSource>(IObservable<TSource> source)
4747
{
48-
return RuntimeManager.RuntimeSource.SelectMany(runtime =>
49-
{
50-
return source.Select(_ =>
51-
{
52-
using (Py.GIL())
53-
{
54-
var module = Module ?? runtime.MainModule;
55-
return module.Exec(Script);
56-
}
57-
});
58-
});
48+
return RuntimeManager.RuntimeSource
49+
.GetModuleOrDefaultAsync(Module)
50+
.SelectMany(module => source.Select(_ => module.Exec(Script)));
5951
}
6052

6153
/// <summary>
@@ -71,13 +63,7 @@ public override IObservable<PyModule> Process<TSource>(IObservable<TSource> sour
7163
/// </returns>
7264
public IObservable<PyModule> Process(IObservable<PyModule> source)
7365
{
74-
return source.Select(module =>
75-
{
76-
using (Py.GIL())
77-
{
78-
return module.Exec(Script);
79-
}
80-
});
66+
return source.Select(module => module.Exec(Script));
8167
}
8268

8369
/// <summary>
@@ -92,13 +78,7 @@ public IObservable<PyModule> Process(IObservable<PyModule> source)
9278
/// </returns>
9379
public IObservable<PyModule> Process(IObservable<RuntimeManager> source)
9480
{
95-
return source.Select(runtime =>
96-
{
97-
using (Py.GIL())
98-
{
99-
return runtime.MainModule.Exec(Script);
100-
}
101-
});
81+
return source.Select(runtime => runtime.MainModule.Exec(Script));
10282
}
10383
}
10484
}

src/Bonsai.Scripting.Python/Get.cs

Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,10 @@ public class Get : Source<PyObject>
3838
/// </returns>
3939
public override IObservable<PyObject> Generate()
4040
{
41-
return RuntimeManager.RuntimeSource.SelectMany(runtime =>
42-
{
43-
var module = Module ?? runtime.MainModule;
44-
return Observable.Return(module.Get(VariableName));
45-
});
41+
return RuntimeManager.RuntimeSource
42+
.GetModuleOrDefaultAsync(Module)
43+
.ObserveOnGIL()
44+
.Select(module => module.Get(VariableName));
4645
}
4746

4847
/// <summary>
@@ -61,17 +60,9 @@ public override IObservable<PyObject> Generate()
6160
/// </returns>
6261
public IObservable<PyObject> Generate<TSource>(IObservable<TSource> source)
6362
{
64-
return RuntimeManager.RuntimeSource.SelectMany(runtime =>
65-
{
66-
return source.Select(_ =>
67-
{
68-
using (Py.GIL())
69-
{
70-
var module = Module ?? runtime.MainModule;
71-
return module.Get(VariableName);
72-
}
73-
});
74-
});
63+
return RuntimeManager.RuntimeSource
64+
.GetModuleOrDefaultAsync(Module)
65+
.SelectMany(module => source.Select(_ => module.Get(VariableName)));
7566
}
7667

7768
/// <summary>
@@ -89,13 +80,7 @@ public IObservable<PyObject> Generate<TSource>(IObservable<TSource> source)
8980
/// </returns>
9081
public IObservable<PyObject> Process(IObservable<PyModule> source)
9182
{
92-
return source.Select(module =>
93-
{
94-
using (Py.GIL())
95-
{
96-
return module.Get(VariableName);
97-
}
98-
});
83+
return source.Select(module => module.Get(VariableName));
9984
}
10085

10186
/// <summary>
@@ -112,13 +97,7 @@ public IObservable<PyObject> Process(IObservable<PyModule> source)
11297
/// </returns>
11398
public IObservable<PyObject> Process(IObservable<RuntimeManager> source)
11499
{
115-
return source.Select(runtime =>
116-
{
117-
using (Py.GIL())
118-
{
119-
return runtime.MainModule.Get(VariableName);
120-
}
121-
});
100+
return source.Select(runtime => runtime.MainModule.Get(VariableName));
122101
}
123102
}
124103
}

src/Bonsai.Scripting.Python/Set.cs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,9 @@ public class Set : Sink
4545
/// </returns>
4646
public override IObservable<TSource> Process<TSource>(IObservable<TSource> source)
4747
{
48-
return RuntimeManager.RuntimeSource.SelectMany(runtime =>
49-
{
50-
return source.Do(value =>
51-
{
52-
using (Py.GIL())
53-
{
54-
var module = Module ?? runtime.MainModule;
55-
module.Set(VariableName, value);
56-
}
57-
});
58-
});
48+
return RuntimeManager.RuntimeSource
49+
.GetModuleOrDefaultAsync(Module)
50+
.SelectMany(module => source.Do(value => module.Set(VariableName, value)));
5951
}
6052
}
6153
}

0 commit comments

Comments
 (0)