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