|
26 | 26 | import google.cloud.bigquery as bigquery |
27 | 27 | import humanize |
28 | 28 |
|
| 29 | +import bigframes._config |
| 30 | + |
29 | 31 | if TYPE_CHECKING: |
30 | 32 | import bigframes.core.events |
31 | 33 |
|
@@ -137,78 +139,85 @@ def repr_query_job_html(query_job: Optional[bigquery.QueryJob]): |
137 | 139 | current_display_id: Optional[str] = None |
138 | 140 |
|
139 | 141 |
|
140 | | -def progress_callback( |
141 | | - event: bigframes.core.events.Event, |
142 | | -): |
143 | | - """Displays a progress bar while the query is running""" |
144 | | - global current_display_id |
| 142 | +def create_progress_callback(): |
| 143 | + # bind potentially thread-local config to the callback so that it uses the user thread |
| 144 | + # config even if callback is invoked from a worker thread. |
| 145 | + display_opts = bigframes._config.options.display |
145 | 146 |
|
146 | | - try: |
147 | | - import bigframes._config |
148 | | - import bigframes.core.events |
149 | | - except ImportError: |
150 | | - # Since this gets called from __del__, skip if the import fails to avoid |
151 | | - # ImportError: sys.meta_path is None, Python is likely shutting down. |
152 | | - # This will allow cleanup to continue. |
153 | | - return |
| 147 | + def progress_callback( |
| 148 | + event: bigframes.core.events.Event, |
| 149 | + ): |
| 150 | + """Displays a progress bar while the query is running""" |
| 151 | + global current_display_id |
154 | 152 |
|
155 | | - progress_bar = bigframes._config.options.display.progress_bar |
| 153 | + try: |
| 154 | + import bigframes._config |
| 155 | + import bigframes.core.events |
| 156 | + except ImportError: |
| 157 | + # Since this gets called from __del__, skip if the import fails to avoid |
| 158 | + # ImportError: sys.meta_path is None, Python is likely shutting down. |
| 159 | + # This will allow cleanup to continue. |
| 160 | + return |
156 | 161 |
|
157 | | - if progress_bar == "auto": |
158 | | - progress_bar = "notebook" if in_ipython() else "terminal" |
| 162 | + progress_bar = display_opts.progress_bar |
| 163 | + |
| 164 | + if progress_bar == "auto": |
| 165 | + progress_bar = "notebook" if in_ipython() else "terminal" |
159 | 166 |
|
160 | | - if progress_bar == "notebook": |
161 | | - import IPython.display as display |
| 167 | + if progress_bar == "notebook": |
| 168 | + import IPython.display as display |
162 | 169 |
|
163 | | - display_html = None |
| 170 | + display_html = None |
164 | 171 |
|
165 | | - if isinstance(event, bigframes.core.events.ExecutionStarted): |
166 | | - # Start a new context for progress output. |
167 | | - current_display_id = None |
| 172 | + if isinstance(event, bigframes.core.events.ExecutionStarted): |
| 173 | + # Start a new context for progress output. |
| 174 | + current_display_id = None |
168 | 175 |
|
169 | | - elif isinstance(event, bigframes.core.events.BigQuerySentEvent): |
170 | | - display_html = render_bqquery_sent_event_html(event) |
| 176 | + elif isinstance(event, bigframes.core.events.BigQuerySentEvent): |
| 177 | + display_html = render_bqquery_sent_event_html(event) |
171 | 178 |
|
172 | | - elif isinstance(event, bigframes.core.events.BigQueryRetryEvent): |
173 | | - display_html = render_bqquery_retry_event_html(event) |
| 179 | + elif isinstance(event, bigframes.core.events.BigQueryRetryEvent): |
| 180 | + display_html = render_bqquery_retry_event_html(event) |
174 | 181 |
|
175 | | - elif isinstance(event, bigframes.core.events.BigQueryReceivedEvent): |
176 | | - display_html = render_bqquery_received_event_html(event) |
| 182 | + elif isinstance(event, bigframes.core.events.BigQueryReceivedEvent): |
| 183 | + display_html = render_bqquery_received_event_html(event) |
177 | 184 |
|
178 | | - elif isinstance(event, bigframes.core.events.BigQueryFinishedEvent): |
179 | | - display_html = render_bqquery_finished_event_html(event) |
| 185 | + elif isinstance(event, bigframes.core.events.BigQueryFinishedEvent): |
| 186 | + display_html = render_bqquery_finished_event_html(event) |
180 | 187 |
|
181 | | - elif isinstance(event, bigframes.core.events.SessionClosed): |
182 | | - display_html = f"Session {event.session_id} closed." |
| 188 | + elif isinstance(event, bigframes.core.events.SessionClosed): |
| 189 | + display_html = f"Session {event.session_id} closed." |
183 | 190 |
|
184 | | - if display_html: |
185 | | - if current_display_id: |
186 | | - display.update_display( |
187 | | - display.HTML(display_html), |
188 | | - display_id=current_display_id, |
189 | | - ) |
190 | | - else: |
191 | | - current_display_id = str(random.random()) |
192 | | - display.display( |
193 | | - display.HTML(display_html), |
194 | | - display_id=current_display_id, |
195 | | - ) |
| 191 | + if display_html: |
| 192 | + if current_display_id: |
| 193 | + display.update_display( |
| 194 | + display.HTML(display_html), |
| 195 | + display_id=current_display_id, |
| 196 | + ) |
| 197 | + else: |
| 198 | + current_display_id = str(random.random()) |
| 199 | + display.display( |
| 200 | + display.HTML(display_html), |
| 201 | + display_id=current_display_id, |
| 202 | + ) |
196 | 203 |
|
197 | | - elif progress_bar == "terminal": |
198 | | - message = None |
199 | | - |
200 | | - if isinstance(event, bigframes.core.events.BigQuerySentEvent): |
201 | | - message = render_bqquery_sent_event_plaintext(event) |
202 | | - print(message) |
203 | | - elif isinstance(event, bigframes.core.events.BigQueryRetryEvent): |
204 | | - message = render_bqquery_retry_event_plaintext(event) |
205 | | - print(message) |
206 | | - elif isinstance(event, bigframes.core.events.BigQueryReceivedEvent): |
207 | | - message = render_bqquery_received_event_plaintext(event) |
208 | | - print(message) |
209 | | - elif isinstance(event, bigframes.core.events.BigQueryFinishedEvent): |
210 | | - message = render_bqquery_finished_event_plaintext(event) |
211 | | - print(message) |
| 204 | + elif progress_bar == "terminal": |
| 205 | + message = None |
| 206 | + |
| 207 | + if isinstance(event, bigframes.core.events.BigQuerySentEvent): |
| 208 | + message = render_bqquery_sent_event_plaintext(event) |
| 209 | + print(message) |
| 210 | + elif isinstance(event, bigframes.core.events.BigQueryRetryEvent): |
| 211 | + message = render_bqquery_retry_event_plaintext(event) |
| 212 | + print(message) |
| 213 | + elif isinstance(event, bigframes.core.events.BigQueryReceivedEvent): |
| 214 | + message = render_bqquery_received_event_plaintext(event) |
| 215 | + print(message) |
| 216 | + elif isinstance(event, bigframes.core.events.BigQueryFinishedEvent): |
| 217 | + message = render_bqquery_finished_event_plaintext(event) |
| 218 | + print(message) |
| 219 | + |
| 220 | + return progress_callback |
212 | 221 |
|
213 | 222 |
|
214 | 223 | def wait_for_job(job: GenericJob, progress_bar: Optional[str] = None): |
|
0 commit comments