簡體   English   中英

有沒有辦法在不使用 python GIL 的情況下進行序列化/反序列化

[英]Is there a way to serialize/deserialize without engaging the python GIL

快速測試表明 cPickle(python 3.6.9 import pickle 默認使用 cPickle )參與 GIL。

import pickle
import os

big_data = os.urandom(10000000)

def run():
    pickle.loads(pickle.dumps(big_data))

t = timeit.Timer(run)
[threading.Thread(target=lambda: t.timeit(number=2000)).start() for _ in range(4)]

運行序列化操作的 4 個線程的測試在 100% cpu 上運行,例如它使用 GIL。 運行 numpy 操作的相同類型的測試使用 400% cpu(沒有 GIL 與 numpy 接合)。

我希望作為 C function 的 cPickle 不會參與 GIL。 有沒有辦法解決? 我希望能夠在不阻塞主進程的情況下反序列化大量數據。

我試圖將每秒 3GB 以上的數據從工作進程拉回主進程。 我可以使用流 sockets 和 asyncio 以 4GB/秒的速度移動數據,但反序列化是一個瓶頸。 不幸的是,我還沒有 Python 3.8 和 SharedMemory 的奢侈

當然,一個可以接受的答案是肯定的“否”。

從評論中獲取@juanpa.arrivillaga 的回答來結束這個問題:

我不明白為什么模塊是 C 擴展的事實會讓你認為它不會參與 GIL。 據我了解,GIL 解決的基本問題是對 Python 解釋器級對象的線程安全訪問,這些對象依賴於垃圾收集的引用計數。 由於 pickle 序列化/反序列化涉及其他線程可能有權訪問的 Python 對象,因此它必須使用 GIL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM