2014-09-01 5 views
5

Ho bisogno di passare il file come argomento all'attività di sedici, ma il file passato è arrivato in qualche modo chiuso. Succede solo nel caso in cui sto eseguendo il compito in modo asincrono. Si tratta di un comportamento previsto?passare l'istanza del file come argomento all'attività di sedici solleva "ValoreErrore: operazione I/O su file chiuso"

guardati:

from engine.tasks import s3_upload_handler 
def myfunc(): 
    f = open('/app/uploads/pic.jpg', 'rb') 
    s3_file_handler.apply_async(kwargs={"uploaded_file" : f,"file_name" : "test.jpg"}) 

compiti:

def s3_upload_handler(uploaded_file,file_name): 
    ... 
    #some code for uploading to s3 

traceback:

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 240, in trace_task 
    R = retval = fun(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 437, in __protected_call__ 
    return self.run(*args, **kwargs) 
    File "/app/photohosting/engine/tasks.py", line 34, in s3_upload_handler 
    key.set_contents_from_file(uploaded_file) 
    File "/usr/local/lib/python2.7/dist-packages/boto/s3/key.py", line 1217, in set_contents_from_file 
    spos = fp.tell() 
ValueError: I/O operation on closed file 

registri di fiori:

kwargs { 
     'file_name': 'test.jpg', 
     'uploaded_file': <closed file '<uninitialized file>', 
      mode '<uninitialized file>' at 0x7f6ab9e75e40> 
     } 

risposta

5

Sì, certo, il file verrebbe chiuso. Le attività asincrone di sedano vengono eseguite in un processo completamente separato (inoltre, possono persino essere eseguite su una macchina diversa) e non è possibile passare un file aperto.

È necessario chiudere il file nel processo da cui si chiama l'attività, quindi passare il suo nome e magari posizionarlo nel file (se necessario) all'attività e quindi riaprirlo nell'attività.

+1

significa che non è possibile passare in memoria l'istanza del file all'attività asincrona e dovrei salvarla prima? –

+0

@ValentinKantor se con "salva" intendi "chiudi", allora sì, devi chiudere l'istanza del file –

0

Un altro modo per farlo sarebbe aprire il file e ottenere un blob binario che si trasferisce sul filo. Ovviamente, se il file è molto grande, ciò che @Vasily dice è meglio, ma non funzionerà nel caso in cui il lavoratore funzioni su un diverso m/c (a meno che il tuo file non sia su una memoria condivisa).

+0

Ciao, potresti spiegare come ottenere un blob binario dal file? – kardaj

Problemi correlati