@@ -11,13 +11,20 @@ public class PyScopeTest
11
11
[ SetUp ]
12
12
public void SetUp ( )
13
13
{
14
- ps = Py . Session ( "test" ) ;
14
+ using ( Py . GIL ( ) )
15
+ {
16
+ ps = Py . Scope ( "test" ) ;
17
+ }
15
18
}
16
19
17
20
[ TearDown ]
18
21
public void Dispose ( )
19
22
{
20
- ps . Dispose ( ) ;
23
+ using ( Py . GIL ( ) )
24
+ {
25
+ ps . Dispose ( ) ;
26
+ ps = null ;
27
+ }
21
28
}
22
29
23
30
/// <summary>
@@ -26,9 +33,12 @@ public void Dispose()
26
33
[ Test ]
27
34
public void TestEval ( )
28
35
{
29
- ps . SetVariable ( "a" , 1 ) ;
30
- var result = ps . Eval < int > ( "a + 2" ) ;
31
- Assert . AreEqual ( result , 3 ) ;
36
+ using ( Py . GIL ( ) )
37
+ {
38
+ ps . SetVariable ( "a" , 1 ) ;
39
+ var result = ps . Eval < int > ( "a + 2" ) ;
40
+ Assert . AreEqual ( result , 3 ) ;
41
+ }
32
42
}
33
43
34
44
/// <summary>
@@ -37,11 +47,14 @@ public void TestEval()
37
47
[ Test ]
38
48
public void TestExec ( )
39
49
{
40
- ps . SetVariable ( "bb" , 100 ) ; //declare a global variable
41
- ps . SetVariable ( "cc" , 10 ) ; //declare a local variable
42
- ps . Exec ( "aa = bb + cc + 3" ) ;
43
- var result = ps . GetVariable < int > ( "aa" ) ;
44
- Assert . AreEqual ( result , 113 ) ;
50
+ using ( Py . GIL ( ) )
51
+ {
52
+ ps . SetVariable ( "bb" , 100 ) ; //declare a global variable
53
+ ps . SetVariable ( "cc" , 10 ) ; //declare a local variable
54
+ ps . Exec ( "aa = bb + cc + 3" ) ;
55
+ var result = ps . GetVariable < int > ( "aa" ) ;
56
+ Assert . AreEqual ( result , 113 ) ;
57
+ }
45
58
}
46
59
47
60
/// <summary>
@@ -51,11 +64,14 @@ public void TestExec()
51
64
[ Test ]
52
65
public void TestCompileExpression ( )
53
66
{
54
- ps . SetVariable ( "bb" , 100 ) ; //declare a global variable
55
- ps . SetVariable ( "cc" , 10 ) ; //declare a local variable
56
- PyObject script = ps . Compile ( "bb + cc + 3" , "" , RunFlagType . Eval ) ;
57
- var result = ps . Execute < int > ( script ) ;
58
- Assert . AreEqual ( result , 113 ) ;
67
+ using ( Py . GIL ( ) )
68
+ {
69
+ ps . SetVariable ( "bb" , 100 ) ; //declare a global variable
70
+ ps . SetVariable ( "cc" , 10 ) ; //declare a local variable
71
+ PyObject script = ps . Compile ( "bb + cc + 3" , "" , RunFlagType . Eval ) ;
72
+ var result = ps . Execute < int > ( script ) ;
73
+ Assert . AreEqual ( result , 113 ) ;
74
+ }
59
75
}
60
76
61
77
/// <summary>
@@ -66,12 +82,15 @@ public void TestCompileExpression()
66
82
[ Test ]
67
83
public void TestCompileStatements ( )
68
84
{
69
- ps . SetVariable ( "bb" , 100 ) ; //declare a global variable
70
- ps . SetVariable ( "cc" , 10 ) ; //declare a local variable
71
- PyObject script = ps . Compile ( "aa = bb + cc + 3" , "" , RunFlagType . File ) ;
72
- ps . Execute ( script ) ;
73
- var result = ps . GetVariable < int > ( "aa" ) ;
74
- Assert . AreEqual ( result , 113 ) ;
85
+ using ( Py . GIL ( ) )
86
+ {
87
+ ps . SetVariable ( "bb" , 100 ) ; //declare a global variable
88
+ ps . SetVariable ( "cc" , 10 ) ; //declare a local variable
89
+ PyObject script = ps . Compile ( "aa = bb + cc + 3" , "" , RunFlagType . File ) ;
90
+ ps . Execute ( script ) ;
91
+ var result = ps . GetVariable < int > ( "aa" ) ;
92
+ Assert . AreEqual ( result , 113 ) ;
93
+ }
75
94
}
76
95
77
96
/// <summary>
@@ -80,16 +99,19 @@ public void TestCompileStatements()
80
99
[ Test ]
81
100
public void TestSubScope ( )
82
101
{
83
- ps . SetVariable ( "bb" , 100 ) ; //declare a global variable
84
- ps . SetVariable ( "cc" , 10 ) ; //declare a local variable
102
+ using ( Py . GIL ( ) )
103
+ {
104
+ ps . SetVariable ( "bb" , 100 ) ; //declare a global variable
105
+ ps . SetVariable ( "cc" , 10 ) ; //declare a local variable
85
106
86
- PyScope scope = ps . SubScope ( ) ;
87
- scope . Exec ( "aa = bb + cc + 3" ) ;
88
- var result = scope . GetVariable < int > ( "aa" ) ;
89
- Assert . AreEqual ( result , 113 ) ; //
90
- scope . Dispose ( ) ;
107
+ PyScope scope = ps . SubScope ( ) ;
108
+ scope . Exec ( "aa = bb + cc + 3" ) ;
109
+ var result = scope . GetVariable < int > ( "aa" ) ;
110
+ Assert . AreEqual ( result , 113 ) ; //
111
+ scope . Dispose ( ) ;
91
112
92
- Assert . IsFalse ( ps . ContainsVariable ( "aa" ) ) ;
113
+ Assert . IsFalse ( ps . ContainsVariable ( "aa" ) ) ;
114
+ }
93
115
}
94
116
95
117
/// <summary>
@@ -99,14 +121,17 @@ public void TestSubScope()
99
121
[ Test ]
100
122
public void TestImport ( )
101
123
{
102
- dynamic sys = ps . Import ( "sys" ) ;
103
- Assert . IsTrue ( ps . ContainsVariable ( "sys" ) ) ;
104
-
105
- ps . Exec ( "sys.attr1 = 2" ) ;
106
- var value1 = ps . Eval < int > ( "sys.attr1" ) ;
107
- var value2 = ( int ) sys . attr1 . AsManagedObject ( typeof ( int ) ) ;
108
- Assert . AreEqual ( value1 , 2 ) ;
109
- Assert . AreEqual ( value2 , 2 ) ;
124
+ using ( Py . GIL ( ) )
125
+ {
126
+ dynamic sys = ps . Import ( "sys" ) ;
127
+ Assert . IsTrue ( ps . ContainsVariable ( "sys" ) ) ;
128
+
129
+ ps . Exec ( "sys.attr1 = 2" ) ;
130
+ var value1 = ps . Eval < int > ( "sys.attr1" ) ;
131
+ var value2 = ( int ) sys . attr1 . AsManagedObject ( typeof ( int ) ) ;
132
+ Assert . AreEqual ( value1 , 2 ) ;
133
+ Assert . AreEqual ( value2 , 2 ) ;
134
+ }
110
135
}
111
136
112
137
/// <summary>
@@ -116,28 +141,59 @@ public void TestImport()
116
141
[ Test ]
117
142
public void TestImportAs ( )
118
143
{
119
- ps . ImportAs ( "sys" , "sys1" ) ;
120
- Assert . IsTrue ( ps . ContainsVariable ( "sys1" ) ) ;
144
+ using ( Py . GIL ( ) )
145
+ {
146
+ ps . ImportAs ( "sys" , "sys1" ) ;
147
+ Assert . IsTrue ( ps . ContainsVariable ( "sys1" ) ) ;
148
+ }
121
149
}
122
150
123
151
/// <summary>
124
152
/// Suspend the Session, and reuse it later.
125
153
/// </summary>
126
154
[ Test ]
127
- public void TestSuspend ( )
155
+ public void TestThread ( )
128
156
{
129
- ps . SetVariable ( "bb" , 100 ) ;
130
- ps . SetVariable ( "cc" , 10 ) ;
131
- ps . Suspend ( ) ;
132
-
157
+ //I open an proposal here https://github.com/pythonnet/pythonnet/pull/419
158
+ //after it merged, the BeginAllowThreads statement blow and the last EndAllowThreads statement
159
+ //should be removed.
160
+ var ts = PythonEngine . BeginAllowThreads ( ) ;
133
161
using ( Py . GIL ( ) )
134
162
{
135
- PythonEngine . RunSimpleString ( "import sys;" ) ;
163
+ ps . SetVariable ( "res" , 0 ) ;
164
+ ps . SetVariable ( "bb" , 100 ) ;
165
+ ps . SetVariable ( "th_cnt" , 0 ) ;
136
166
}
137
-
138
- ps . Exec ( "aa = bb + cc + 3" ) ;
139
- var result = ps . GetVariable < int > ( "aa" ) ;
140
- Assert . AreEqual ( result , 113 ) ;
167
+ int th_cnt = 3 ;
168
+ for ( int i = 0 ; i < th_cnt ; i ++ )
169
+ {
170
+ System . Threading . Thread th = new System . Threading . Thread ( ( ) =>
171
+ {
172
+ using ( Py . GIL ( ) )
173
+ {
174
+ ps . Exec (
175
+ "res += bb + 1\n " +
176
+ "th_cnt += 1\n " ) ;
177
+ }
178
+ } ) ;
179
+ th . Start ( ) ;
180
+ }
181
+ //do not use Thread.Join to make this test more complicate
182
+ int cnt = 0 ;
183
+ while ( cnt != th_cnt )
184
+ {
185
+ using ( Py . GIL ( ) )
186
+ {
187
+ cnt = ps . GetVariable < int > ( "th_cnt" ) ;
188
+ }
189
+ System . Threading . Thread . Sleep ( 10 ) ;
190
+ }
191
+ using ( Py . GIL ( ) )
192
+ {
193
+ var result = ps . GetVariable < int > ( "res" ) ;
194
+ Assert . AreEqual ( 101 * th_cnt , result ) ;
195
+ }
196
+ PythonEngine . EndAllowThreads ( ts ) ;
141
197
}
142
198
}
143
199
}
0 commit comments