2016-02-25 2 views
2

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?

  • Если я позволю этому запустить пару часов, у меня будет проблема с памятью?

+0

Я думаю, что вы не можете возвращать данные из потока (возможно, с некоторыми пулами вещей, я читал о них, но не уверен.). Я бы использовал модуль подпроцесса с 'check_output' - поскольку я знаю, что это хороший способ избежать проблем с GIL, что может привести к более длительному исполнению. –

+0

Проблема с памятью может означать много вещей. Если вы ссылаетесь на переполнение счетчика, это зависит от того, насколько быстро это время цикла. (зависит от аппаратного обеспечения). В конце концов он будет переполняться. – Henrik

+0

@Henrik Я запустил скрипт перестановок на другой день, и когда 50% выполнения было выполнено, я получил предупреждение от os x, что у меня не хватает памяти. Не знал, был ли это сам терминал, или если у python было переполнение. Возможно, это был терминал, потому что сценарий повторял каждую итерацию. Итак, вывод: я не совсем уверен, что я имею в виду с проблемой памяти =) – Adam

ответ

2

Вы можете сделать это, создав свой собственный класс Thread. Но имейте в виду, что этот бесконечный цикл поглотит ваше ядро ​​процессора, на котором будет работать этот поток.

class MyCounter(threading.Thread): 
    def __init__(self, *args, **kwargs): 
    super(MyCounter, self).__init__() 
    self.count = 0 
    self._running = True 

    def run(self): 
    while self._running: 
     self.count += 1 

    def quit(self): 
    self._running = False 

C = MyCounter() 
C.start() 

while 1: 
    try: 
     command = raw_input('Command: ') 
     if command == 'quit': 
      C.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() 
+0

Спасибо, сэр! очень хорошо! Я должен добавить 'str' для' print (C.count + '\ n') '. 'print (str (C.count) + '\ n')'. Еще раз спасибо! – Adam

Смежные вопросы