2016-06-05 2 views
-1

Полный код (снизу GitHub связаны страницы):питон многопоточный на выходе информации

#!/usr/bin/python 
# -*- coding: UTF-8 -*- 

import threading 
import time 
import random 
import copy 

exitFlag = 0 

class checkup (threading.Thread): #繼承thred 檢查流程 
    def __init__(self, threadID, patientList, patientStatus): 
    threading.Thread.__init__(self) 
    self.threadID = threadID 
    self.patientList = patientList 
    self.patientStatus = patientStatus 
    def run(self):     #檢查中 
    while True: 
     if(check(self.patientList)): 
     break 
     for i in range(0, 2, 1): 
     for status in self.patientStatus: 
      if status['name'] == self.patientList[i]['name'] and status['status'] == False and self.patientList[i]['status'] == False: 
      status['status'] = True 
      checkTime = random.randint(1,3) 
      print "%s: %s check time(%d)" % (self.patientList[i]['name'], self.threadID, checkTime) 
      time.sleep(checkTime) 
      self.patientList[i]['status'] = True 
      status['status'] = False 
      time.sleep(1) 

#check all patients have to be ckecked 
def check(patientList): 
    checkFlag = False 
    for patient in patientList: 
    if patient['status'] == True: 
     checkFlag = True 
    else: 
     checkFlag = False 
    if checkFlag: 
    return True 
    else: 
    return False 

# patients init 
patients = [{ 
    'name': 'Kevin', 
    'status': False 
},{ 
    'name': 'Tom', 
    'status': False 
}] 

# Outpatient init 
random.shuffle(patients) 
Cardiology = { 
    'name': 'Cardiology', 
    'patientList': copy.deepcopy(patients), 
    'patientStatus': patients 
} 
CardiologyCheckup = checkup('Cardiology', Cardiology['patientList'], Cardiology['patientStatus']) 

random.shuffle(patients) 
Chest = { 
    'name': 'Chest', 
    'patientList': copy.deepcopy(patients), 
    'patientStatus': patients 
} 
ChestCheckup = checkup('Chest', Chest['patientList'], Chest['patientStatus']) 

ChestCheckup.start() 
CardiologyCheckup.start() 

Источник здесь: [https://github.com/stevekevin1005/OS/blob/master/os.py]

Я хочу, чтобы это выход:

Tom: Chest check time(1) 
Kevin: Cardiology check time(2) 
Kevin: Chest check time(1) 
Tom: Cardiology check time(1) 

но иногда:

Kevin: Chest check time(2) 
Tom: Cardiology check time(3) 
Tom: Chest check time(1) 

только три строки

Что я совершу?


Как создать элемент, подобный объекту? ex.

a={ 
'a': 1, 
'b': 2 
} 
#a[a] 1 
#a[b] 2 
+1

Не могли бы вы включить код в вопрос (или фрагмент, если он слишком длинный) вместо ссылки? Кроме того, кажется, что ваш код немного грязный. Взгляните на [PEP 8] (https://www.python.org/dev/peps/pep-0008/). –

+0

Спасибо за редактирование. Есть ли причина, почему вместо вставки 72 полных строк кода вы вставляете какую-то часть в вопрос? – Dilettant

+0

Я не могу заполнить весь код, кажется, слишком много времени для вставки –

ответ

0

Так, как и было обещано, это версия PEP8 ok (обратите внимание также на изменение имен в переменных и клавишах на используемые dicts). Он должен, помимо ответа на вопрос, помочь OP разоблачить преобразования (как пояснил @MoonCheesez в комментарии).

Обратите внимание, что я уже удалил несанкционированную переменную уровня модуля exitFlag, упорядочил некоторые логические оценки w.r.t. False, True и используется ** kwargs, чтобы сделать цепочку параметров более легкой на глазах.

Также обратите внимание, что я интерпретировал волю, сравнивающую все эти переменные с False или True, не был наилучшим образом представлен как «ложь» (например), а на самом деле только правдивость или ложность.

Так вот идет pepified версия:

#!/usr/bin/python 
# -*- coding: UTF-8 -*- 
"""Explain here what this module has to offer.""" 
from __future__ import print_function 
import copy 
import random 
import sys 
import threading 
import time 


class CheckUp(threading.Thread): 
    """Explain here what this class represents and some usage hints.""" 
    def __init__(self, **kwargs): 
     threading.Thread.__init__(self) 
     self.threadID = kwargs['area_name'] 
     self.patient_list = kwargs['patient_list'] 
     self.patients_w_status = kwargs['patients_w_status'] 

    def run(self): 
     """Describe logic of processing here.""" 
     s_k, n_k = 'status', 'name' 
     busy_sleep_secs = 1 
     while True: 
      if check(self.patient_list): 
       break 
      for i in range(0, 2, 1): 
       for status in self.patients_w_status: 
        if status[n_k] == self.patient_list[i][n_k]: 
         if not (status[s_k] or self.patient_list[i][s_k]): 
          status[s_k] = True 
          check_time = random.randint(1, 3) 
          print("%s: %s check time(%d)" 
            "" % (self.patient_list[i][n_k], 
             self.threadID, check_time)) 
          time.sleep(check_time) 
          self.patient_list[i][s_k] = True 
          status[s_k] = False 
          time.sleep(busy_sleep_secs) 


def check(patient_list): 
    """Check all patients have to be checked.""" 
    check_flag = False 
    for patient in patient_list: 
     check_flag = True if patient['status'] else False 
    return check_flag 


def main(): 
    """Drive the endeavour.""" 
    # patients init 
    patients = [{ 
     'name': 'Kevin', 
     'status': False 
    }, { 
     'name': 'Tom', 
     'status': False 
    }] 

    # Outpatient init 
    random.shuffle(patients) 
    cardiology = { 
     'area_name': 'Cardiology', 
     'patient_list': copy.deepcopy(patients), 
     'patients_w_status': copy.deepcopy(patients) 
    } 
    cardiologyCheckup = CheckUp(**cardiology) 

    random.shuffle(patients) 
    chest = { 
     'area_name': 'Chest', 
     'patient_list': copy.deepcopy(patients), 
     'patients_w_status': copy.deepcopy(patients) 
    } 
    chestCheckup = CheckUp(**chest) 

    chestCheckup.start() 
    cardiologyCheckup.start() 


if __name__ == '__main__': 
    sys.exit(main()) 

При вызове, не пользуясь copy.deepcopy(patients) в качестве значения для patients_w_status ключа в dicts:

$> python2 so_threading_output.py 
Kevin: Chest check time(1) 
Tom: Cardiology check time(2) 
Tom: Chest check time(2) 

$> python2 so_threading_output.py 
Kevin: Chest check time(3) 
Tom: Cardiology check time(1) 
Tom: Chest check time(3) 

При использовании выше исправленную версию, которая также глубокие копии пациенты вносят в поля ключевых слов patient_w_status:

$> python2 so_threading_output.py 
Tom: Chest check time(3) 
Tom: Cardiology check time(2) 
Kevin: Cardiology check time(1) 
Kevin: Chest check time(3) 

$> python2 so_threading_output.py 
Kevin: Chest check time(3) 
Tom: Cardiology check time(3) 
Kevin: Cardiology check time(2) 
Tom: Chest check time(2) 

Решает ли это проблему. Похоже, похоже, нет никаких причин для глубокого копирования одного диктата и мелкой копии другого, когда он каким-то образом обрабатывается.

+1

Собирался публиковать это тоже, но был слишком занят, перефразируя его. –

+0

Может быть, это стоит? Именование и обработка вещей - важный баланс ИМО для поддержания, и это часть нашего подхода к ОП. Хорошие инструменты помогают реорганизовать, чтобы восстановить более адекватный баланс, который здесь Python предлагает вместе с PEP8 с самого начала ... – Dilettant

+0

Большое вам спасибо, второй вопрос решен ... thx m_ _m –