? 今天使用Pool使用Queue來傳遞數據的時候報錯:
Queue objects should only be shared between processes through inheritance
? 后來研究了一下發現網上的教程大部分是要求用mp包里的Manager來構建一個proxy來使用Queue,但其實解決這個錯誤不一定需要使用Manager.Queue,這個錯誤報錯的地方其實是在fork的時候,把Queue對象作為參數傳進給子進程導致的錯誤。所以使用繼承的方式來傳遞這個對象就可以了。
? 這里介紹一下Python的三種共享對象的方式:
共享方式 | 支持的類型 |
---|---|
Shared memory | ctypes當中的類型,通過RawValue,RawArray等包裝類提供 |
Inheritance | 系統內核對象,以及基于這些對象實現的對象。包括Pipe, Queue, JoinableQueue, 同步對象(Semaphore, Lock, RLock, Condition, Event等等) |
Server process | 有對象,可能需要自己手工提供代理對象(Proxy) |
? 如果使用Manager.Queue就是使用第三種Server process方式來共享對象啦,但是直接使用第一種Shared memory方式來共享對象會更簡單。
? 所以解決方法很簡單,在所有進程Pool可以訪問的代碼塊中新建一個Queue就OK了,這樣所有進程在fork的時候復制到的資源描述符其實都是直接指向主進程穿件的Queue的,而且同時這些進程也是他們的子進程,所以可以訪問Queue而且也不會報錯。