Вы можете использовать numpy.select
и для получения имен столбцов format
:
for i in range (1980,2015,5):
m1 = df["DWWC{}".format(i)] <=18.25
#inverted m1 mask by ~
m2 = ~m1 & (df["DWWC{}".format(i)] <= 36.5)
a = (((10-33)/(5))*(df["DWWC{}".format(i)]-5))+10
b = ((10/(df.two-df.three))*(df["DWWC{}".format(i)]-df.three))+df.Three
c = (((df.Three_value-6)/(df.three-5))*(df["DWWC{}".format(i)]-6
df["MWTP{}".format(i)] = np.select([m1,m2],[a,b], default=c)
Простой пример:
import os
chidren = []
for job in jobs:
child = os.fork()
if child:
children.append(child)
else:
pass # really should exec the job
for child in children:
os.waitpid(child, 0)
Таймаут медленного ребенка является немного большим количеством работы; можно использовать wait
вместо waitpid
, и отберите возвращаемый значения из списка детей, вместо того, чтобы ожидать на каждом в свою очередь (как здесь). Если Вы настраиваете alarm
с a SIGALRM
обработчик, можно завершить ожидание после указанной задержки. Это - весь стандартный материал UNIX, не определенный для Python...
Ephemient: каждый ребенок в Вашем коде останется дома для цикла после того, как его задание закончится. Он разветвится снова и снова. Кроме того, дети, которые запускаются, когда дети [] не пусто, попытаются ожидать некоторых своих братьев в конце цикла. В конечном счете кто-то откажет. Это - обходное решение:
import os, time
def doTheJob(job):
for i in xrange(10):
print job, i
time.sleep(0.01*ord(os.urandom(1)))
# random.random() would be the same for each process
jobs = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
imTheFather = True
children = []
for job in jobs:
child = os.fork()
if child:
children.append(child)
else:
imTheFather = False
doTheJob(job)
break
# in the meanwhile
# ps aux|grep python|grep -v grep|wc -l == 11 == 10 children + the father
if imTheFather:
for child in children:
os.waitpid(child, 0)
Традиционный, UNIX-y способ общаться с подпроцессами должен открыть каналы для их стандартного ввода/вывода и использовать select()
системный вызов для мультиплексирования связи в родительском процессе (доступный в Python через... select
модуль).
Если необходимо уничтожить медленно рабочий дочерний процесс, можно просто сохранить его идентификатор процесса (возвращенный os.fork()
звоните), и затем используйте os.kill()
уничтожить его при отсутствии необходимости больше. Конечно, это, вероятно, было бы более чисто, чтобы смочь общаться с дочерним процессом явно и сказать этому завершать работу себя.