@@ -12,6 +12,7 @@ namespace Bonsai.Scripting.Python
1212 public class PythonInterpreterLock : WorkflowExpressionBuilder
1313 {
1414 static readonly Range < int > argumentRange = Range . Create ( lowerBound : 1 , upperBound : 1 ) ;
15+ private static readonly object _lock = new object ( ) ;
1516
1617 public PythonInterpreterLock ( )
1718 : this ( new ExpressionBuilderGraph ( ) )
@@ -27,44 +28,36 @@ public PythonInterpreterLock(ExpressionBuilderGraph workflow)
2728
2829 public override Expression Build ( IEnumerable < Expression > arguments )
2930 {
30- // var source = arguments.Single();
31- // var sourceType = source.Type.GetGenericArguments()[0]; // Get TSource from IObservable<TSource>
32- // var factoryParameter = Expression.Parameter(typeof(IObservable<>).MakeGenericType(sourceType));
33- Console . WriteLine ( $ "here1 args: { arguments } ") ;
3431 var source = arguments . FirstOrDefault ( ) ;
3532 if ( source == null )
3633 {
3734 throw new InvalidOperationException ( "There must be at least one input." ) ;
3835 }
3936 var sourceType = source . Type . GetGenericArguments ( ) [ 0 ] ; // Get TSource from IObservable<TSource>
40- Console . WriteLine ( $ "here2 sourceType: { source . Type } ") ;
41- // var factoryParameter = Expression.Parameter(source.Type);
4237 var factoryParameter = Expression . Parameter ( typeof ( IObservable < > ) . MakeGenericType ( sourceType ) , "factoryParam" ) ;
43- Console . WriteLine ( $ "here3 factoryParam: { factoryParameter } " ) ;
38+
4439 return BuildWorkflow ( arguments , factoryParameter , selectorBody =>
4540 {
46- Console . WriteLine ( $ "here4 selectorBody: { selectorBody } ") ;
4741 var selector = Expression . Lambda ( selectorBody , factoryParameter ) ;
48- Console . WriteLine ( $ "here5 selector: { selector } ") ;
4942 var resultType = selectorBody . Type . GetGenericArguments ( ) [ 0 ] ;
50- Console . WriteLine ( $ "here6 resultType: { resultType } ") ;
51- // var processMethod = typeof(PythonInterpreterLock).GetMethod(nameof(Process)).MakeGenericMethod(sourceType, resultType);
52- // Console.WriteLine($"here7 processMethod: {processMethod}");
53- // return Expression.Call(processMethod, source, selector);
5443 return Expression . Call ( GetType ( ) , nameof ( Process ) , new Type [ ] { sourceType , resultType } , source , selector ) ;
5544 } ) ;
5645 }
5746
5847 static IObservable < TResult > Process < TSource , TResult > ( IObservable < TSource > source , Func < IObservable < TSource > , IObservable < TResult > > selector )
5948 {
60- Console . WriteLine ( "process" ) ;
61- return Observable . Defer ( ( ) =>
49+ lock ( _lock )
6250 {
63- using ( Py . GIL ( ) )
51+ return source . SelectMany ( value =>
6452 {
65- return selector ( source ) ;
66- }
67- } ) ;
53+ using ( Py . GIL ( ) )
54+ {
55+ return selector ( Observable . Return ( value ) ) ;
56+ // );
57+ }
58+ } ) ;
59+ }
60+ // return result;
6861 }
6962 }
7063}
0 commit comments