2015-11-20 6 views
5

Sto progettando un'applicazione Python chiamando una DLL C++, ho pubblicato la mia interazione tra la mia DLL e Python 3.4 here. Ma ora ho bisogno di fare qualche processo in streaming che coinvolga un modello basato su thread e la mia funzione di callback cerca di mettere in coda tutti gli print e solo quando il mio streaming è terminato, tutte le informazioni vengono stampate.Python 'print' in un modello di threading basato su C++

def callbackU(OutList, ConList, nB): 
    for i in range(nB): 
     out_list_item = cast(OutList[i], c_char_p).value 
     print("{}\t{}".format(ConList[i], out_list_item)) 
    return 0 

ho cercato di utilizzare i prossimi modi, ma tutti loro sguardi a lavorare nello stesso modo:

from threading import Lock 

print_lock = Lock() 
def save_print(*args, **kwargs): 
    with print_lock: 
    print (*args, **kwargs) 

def callbackU(OutList, ConList, nB): 
    for i in range(nB): 
     out_list_item = cast(OutList[i], c_char_p).value 
     save_print(out_list_item)) 
    return 0 

e:

import sys 
def callbackU(OutList, ConList, nB): 
    for i in range(nB): 
     a = cast(OutList[i], c_char_p).value 
     sys.stdout.write(a) 
     sys.stdout.flush() 
    return 0 

Vorrei che il mio callback stampa il suo messaggio quando viene chiamato, non quando l'intero processo finisce.

+0

Si prega di riscrivere la tua domanda, come in linguaggio naturale, non ho potuto capire una cosa! –

+0

Ok, è perché non sono un madrelingua, ma potresti capire la mia altra domanda? o dovrei spiegare meglio anche l'altro? –

+1

OT: quasi nessuno legge i link "la mia altra domanda", è molto meglio includere un riepilogo applicabile. D'altra parte, il collegamento a argomenti o risorse ben noti (ad esempio wiki: DAG o pypi: cffi) è il benvenuto. –

risposta

2

Posso trovare qual è il problema, sto usando un processo basato su thread che deve rimanere per un tempo indefinito prima di terminarlo. In C++ sto usando getchar() per aspettare fino a quando il processo deve essere terminato, quindi quando ho premuto il pulsante di invio il processo passa alla parte di rilascio. Ho anche provato a utilizzare sleep() s di 0,5 secondi in un while fino a quando non è trascorso un tempo definito per verificare se ciò potrebbe aiutarmi, ma non è stato così. Entrambi i metodi hanno funzionato allo stesso modo nella mia applicazione Python, i valori che avevo bisogno di avere in streaming sono stati messi prima in una coda e, a meno che il processo terminasse, quei valori sono stati stampati.

La soluzione era di creare due funzioni, la prima per inizializzare il modello basato su thread. E l'ultima funzione per terminare il processo. Così facendo non avevo bisogno di un getchar() né di uno sleep(). Questo funziona abbastanza bene con me !, grazie per l'attenzione!