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