File tree 2 files changed +21
-2
lines changed
crates/polars-python/src/dataframe
py-polars/tests/unit/dataframe
2 files changed +21
-2
lines changed Original file line number Diff line number Diff line change @@ -6,18 +6,28 @@ use polars_io::mmap::ReaderBytes;
6
6
use pyo3:: prelude:: * ;
7
7
8
8
use super :: PyDataFrame ;
9
+ use crate :: error:: PyPolarsErr ;
9
10
use crate :: exceptions:: ComputeError ;
10
11
use crate :: file:: { get_file_like, get_mmap_bytes_reader} ;
11
12
use crate :: utils:: EnterPolarsExt ;
12
13
13
14
#[ pymethods]
14
15
impl PyDataFrame {
15
16
/// Serialize into binary data.
16
- fn serialize_binary ( & mut self , py : Python < ' _ > , py_f : PyObject ) -> PyResult < ( ) > {
17
+ fn serialize_binary ( slf : Bound < ' _ , Self > , py_f : PyObject ) -> PyResult < ( ) > {
17
18
let file = get_file_like ( py_f, true ) ?;
18
19
let mut writer = BufWriter :: new ( file) ;
19
20
20
- py. enter_polars ( || self . df . serialize_into_writer ( & mut writer) )
21
+ let mut slf_1 = slf. try_borrow_mut ( ) ;
22
+ let slf_1: Result < & mut PyDataFrame , _ > = slf_1. as_deref_mut ( ) ;
23
+ let mut slf_2: Option < PyDataFrame > = ( slf_1. is_err ( ) ) . then ( || ( * slf. borrow ( ) ) . clone ( ) ) ;
24
+
25
+ let slf: & mut PyDataFrame = slf_1. unwrap_or_else ( |_| slf_2. as_mut ( ) . unwrap ( ) ) ;
26
+
27
+ Ok ( slf
28
+ . df
29
+ . serialize_into_writer ( & mut writer)
30
+ . map_err ( PyPolarsErr :: from) ?)
21
31
}
22
32
23
33
/// Deserialize a file-like object containing binary data into a DataFrame.
Original file line number Diff line number Diff line change 1
1
from __future__ import annotations
2
2
3
3
import io
4
+ import pickle
4
5
from datetime import date , datetime , timedelta
5
6
from decimal import Decimal as D
7
+ from multiprocessing .pool import ThreadPool
6
8
from typing import TYPE_CHECKING , Any
7
9
8
10
import pytest
@@ -211,3 +213,10 @@ def test_df_serde_list_of_null_17230() -> None:
211
213
ser = df .serialize (format = "json" )
212
214
result = pl .DataFrame .deserialize (io .StringIO (ser ), format = "json" )
213
215
assert_frame_equal (result , df )
216
+
217
+
218
+ def test_df_serialize_from_multiple_python_threads_22364 () -> None :
219
+ df = pl .DataFrame ({"A" : [1 , 2 , 3 , 4 ]})
220
+
221
+ with ThreadPool (4 ) as tp :
222
+ tp .map (pickle .dumps , [df ] * 1_000 )
You can’t perform that action at this time.
0 commit comments