2013-05-20 29 views
1
import multiprocessing 
import time 
import pycurl 

class Bot(multiprocessing.Process): 
    def __init__(self): 
     multiprocessing.Process.__init__(self)  
     self.c = pycurl.Curl() 

    def run(self): 
     pass 

if __name__ == '__main__': 
    Bot().start()  

此代碼在Ubuntu 13.04 x64上運行良好,但在Windows 7 x64/Server 2008 x64上失敗。我使用pyCurl 7.19.0和Python 2.7。 錯誤是:PyCurl。 '無法在Windows x64上醃製Curl對象'錯誤

Z:\bot>python test.py 
Traceback (most recent call last): 
    File "test.py", line 74, in <module> 
    Bot().start() 
    File "C:\Python27\lib\multiprocessing\process.py", line 104, in start 
    self._popen = Popen(self) 
    File "C:\Python27\lib\multiprocessing\forking.py", line 244, in __init__ 
    dump(process_obj, to_child, HIGHEST_PROTOCOL) 
    File "C:\Python27\lib\multiprocessing\forking.py", line 167, in dump 
    ForkingPickler(file, protocol).dump(obj) 
    File "C:\Python27\lib\pickle.py", line 224, in dump 
    self.save(obj) 
    File "C:\Python27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Python27\lib\pickle.py", line 419, in save_reduce 
    save(state) 
    File "C:\Python27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python27\lib\pickle.py", line 649, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "C:\Python27\lib\pickle.py", line 681, in _batch_setitems 
    save(v) 
    File "C:\Python27\lib\pickle.py", line 313, in save 
    (t.__name__, obj)) 
pickle.PicklingError: Can't pickle 'Curl' object: <pycurl.Curl object at 0x00000 
00002360478> 

Z:\bot>Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "C:\Python27\lib\multiprocessing\forking.py", line 347, in main 
    self = load(from_parent) 
    File "C:\Python27\lib\pickle.py", line 1378, in load 
    return Unpickler(file).load() 
    File "C:\Python27\lib\pickle.py", line 858, in load 
    dispatch[key](self) 
    File "C:\Python27\lib\pickle.py", line 880, in load_eof 
    raise EOFError 
EOFError 

爲什麼會發生這種情況?

+0

儘管'pycurl'在linux上很容易構建,但我很難在Windows上使用它;預編譯的Windows安裝程序停止在python2.5。有沒有一個特定的協議,你試圖使用只有'pycurl'支持?有很多選擇。 – SingleNegationElimination

+0

@TokenMacGuy不,我打算用它來獲得一點速度優勢。 – clumpter

+0

嗯...幾乎任何你可能用'libcurl'做的事情都會被IO綁定,你用它來連接本地主機嗎? – SingleNegationElimination

回答

1

在posix系統上,multiprocessing通過使用fork()系統調用工作,它可以克隆正在運行的進程及其所有狀態(包括像複雜類的實例,如pycurl.Curl)。

Windows沒有fork(),或類似的東西,所以multiprocessing火了一個新的Python解釋器爲每個子進程,與監聽父進程,並重新創建狀態的特殊存根功能,使得它看起來很像它將會使用fork()multiprocessing使用的關鍵技術是它在父進程中重新創建子進程中的每個對象,因爲它們被使用。這可以通過將對象轉換爲字節碼錶示形式(使用pickle模塊),通過管道將它們發送給子節點,然後再將它們轉換回python對象。

對於大多數python對象來說,這個工作非常完美,對你來說是透明的。有很多明顯的東西不可能工作,打開的文件不能以這種方式傳遞;也不知道任何關於系統的非python庫對象的狀態。不幸的是,pycurl有點這兩件事。

相關問題