@@ -98,11 +98,9 @@ def __init__(self, filename, queue_size=2, block_size=1024 * 1024):
98
98
self .exception = None
99
99
self .buffer = io .BytesIO ()
100
100
self .block_size = block_size
101
- # Using a daemon thread prevents programs freezing on error.
102
- self .worker = threading .Thread (target = self ._decompress , daemon = True )
101
+ self .worker = threading .Thread (target = self ._decompress )
103
102
self ._closed = False
104
- self .running = True
105
- self .worker .start ()
103
+ self .running = False
106
104
107
105
def _check_closed (self , msg = None ):
108
106
if self ._closed :
@@ -126,8 +124,19 @@ def _decompress(self):
126
124
except queue .Full :
127
125
pass
128
126
127
+ def _start (self ):
128
+ if not self .running :
129
+ self .running = True
130
+ self .worker .start ()
131
+
132
+ def _stop (self ):
133
+ if self .running :
134
+ self .running = False
135
+ self .worker .join ()
136
+
129
137
def readinto (self , b ):
130
138
self ._check_closed ()
139
+ self ._start ()
131
140
result = self .buffer .readinto (b )
132
141
if result == 0 :
133
142
while True :
@@ -155,8 +164,7 @@ def tell(self) -> int:
155
164
def close (self ) -> None :
156
165
if self ._closed :
157
166
return
158
- self .running = False
159
- self .worker .join ()
167
+ self ._stop ()
160
168
self .fileobj .close ()
161
169
if self .closefd :
162
170
self .raw .close ()
@@ -232,18 +240,17 @@ def __init__(self,
232
240
queue .Queue (queue_size ) for _ in range (threads )]
233
241
self .output_queues : List [queue .Queue [Tuple [bytes , int , int ]]] = [
234
242
queue .Queue (queue_size ) for _ in range (threads )]
235
- # Using daemon threads prevents a program freezing on error.
236
- self .output_worker = threading .Thread (target = self ._write , daemon = True )
243
+ self .output_worker = threading .Thread (target = self ._write )
237
244
self .compression_workers = [
238
- threading .Thread (target = self ._compress , args = (i ,), daemon = True )
245
+ threading .Thread (target = self ._compress , args = (i ,))
239
246
for i in range (threads )
240
247
]
241
248
elif threads == 1 :
242
249
self .input_queues = [queue .Queue (queue_size )]
243
250
self .output_queues = []
244
251
self .compression_workers = []
245
252
self .output_worker = threading .Thread (
246
- target = self ._compress_and_write , daemon = True )
253
+ target = self ._compress_and_write )
247
254
else :
248
255
raise ValueError (f"threads should be at least 1, got { threads } " )
249
256
self .threads = threads
@@ -254,7 +261,6 @@ def __init__(self,
254
261
self .raw , self .closefd = open_as_binary_stream (filename , mode )
255
262
self ._closed = False
256
263
self ._write_gzip_header ()
257
- self .start ()
258
264
259
265
def _check_closed (self , msg = None ):
260
266
if self ._closed :
@@ -277,21 +283,24 @@ def _write_gzip_header(self):
277
283
self .raw .write (struct .pack (
278
284
"BBBBIBB" , magic1 , magic2 , method , flags , mtime , os , xfl ))
279
285
280
- def start (self ):
281
- self .running = True
282
- self .output_worker .start ()
283
- for worker in self .compression_workers :
284
- worker .start ()
286
+ def _start (self ):
287
+ if not self .running :
288
+ self .running = True
289
+ self .output_worker .start ()
290
+ for worker in self .compression_workers :
291
+ worker .start ()
285
292
286
293
def stop (self ):
287
294
"""Stop, but do not care for remaining work"""
288
- self .running = False
289
- for worker in self .compression_workers :
290
- worker .join ()
291
- self .output_worker .join ()
295
+ if self .running :
296
+ self .running = False
297
+ for worker in self .compression_workers :
298
+ worker .join ()
299
+ self .output_worker .join ()
292
300
293
301
def write (self , b ) -> int :
294
302
self ._check_closed ()
303
+ self ._start ()
295
304
with self .lock :
296
305
if self .exception :
297
306
raise self .exception
0 commit comments