Im пытается вернуть «моментальный снимок» информации из функции, запущенной в потоке с помощью python. Я думал, что это будет легко, но google doesent будет чувствовать.Возвращает значение из функции потока
import thread
import sys
import time
def counter():
count = 0
while 1:
count = count +1
# Hi screen
print('Welcome to thread example!\n')
# Avalibel commands
print('Enter [quit] to exit. enter [status] for count status')
C = thread.start_new_thread(counter ,())
while 1:
try:
command = raw_input('Command: ')
if command == 'quit':
sys.exit()
elif command == 'status':
print(time.ctime())
print(C.count + '\n')
else:
print('unknown command. [quit] or [satus]')
except KeyboardInterrupt:
print "\nKeybord interrupt, exiting gracefully anyway."
sys.exit()
Это выше пример дает мне AttributeError: 'int' object has no attribute 'count'
, но я попробовал несколько «решения» с различными без успеха.
В этом примере я хочу, чтобы counter()
работал до тех пор, пока я не нахожу выход. Немного выходной пример:
Welcome to thread example!
Enter [quit] to exit. enter [status] for count status
>>> Command: status
Thu Feb 25 09:42:43 2016
123567
>>> Command: status
Thu Feb 25 10:0:43 2016
5676785785768568795
Вопрос:
Как я вернуть "снимок" значение из
def counter
?Если я позволю этому запустить пару часов, у меня будет проблема с памятью?
Я думаю, что вы не можете возвращать данные из потока (возможно, с некоторыми пулами вещей, я читал о них, но не уверен.). Я бы использовал модуль подпроцесса с 'check_output' - поскольку я знаю, что это хороший способ избежать проблем с GIL, что может привести к более длительному исполнению. –
Проблема с памятью может означать много вещей. Если вы ссылаетесь на переполнение счетчика, это зависит от того, насколько быстро это время цикла. (зависит от аппаратного обеспечения). В конце концов он будет переполняться. – Henrik
@Henrik Я запустил скрипт перестановок на другой день, и когда 50% выполнения было выполнено, я получил предупреждение от os x, что у меня не хватает памяти. Не знал, был ли это сам терминал, или если у python было переполнение. Возможно, это был терминал, потому что сценарий повторял каждую итерацию. Итак, вывод: я не совсем уверен, что я имею в виду с проблемой памяти =) – Adam