В моем предыдущем коде есть несоответствия параметров, которые были исправлены, и полный рабочий код представлен ниже.
Я сохранил вывод t-SNE прямо в очередь и получил его в основном потоке. Следующим шагом будет преобразование этого в пул потоков и подклассификацию.
import threading
import queue
from sklearn.manifold import TSNE
import os
import time
def write_tsne_op(opdata,fname,header):
with open(fname, 'w') as outfile:
outfile.write(header)
for data_slice in opdata:
np.savetxt(outfile, data_slice,delimiter=",")
def task1(ip_matrix,qmdlvalues,qmdlparam,plex,exag,qmdltime,qmdlhrfn,hderfname):
string=""
start=0
end=0
mdltiming=0
start = time.time()
tmpmdl1 = TSNE(perplexity=plex,early_exaggeration=exag, n_components=2,random_state=0,verbose=1)
qmdlvalues.put(tmpmdl1.fit_transform(ip_matrix))
string = str(plex)+ "$" + str(exag)
qmdlparam.put(string)
qmdlhrfn.put(hderfname)
end = time.time()
mdltimig = end - start
print(str(mdltiming)+"time")
qmdltime.put(mdltiming)
def task2(ip_matrix,qmdlvalues,qmdlparam,plex,exag,qmdltime,qmdlhrfn,hderfname):
string=""
start=0
end=0
mdltiming=0
start = time.time()
tmpmdl2 = TSNE(perplexity=plex,early_exaggeration=exag, n_components=2,random_state=0,verbose=1)
qmdlvalues.put(tmpmdl2.fit_transform(ip_matrix))
string = str(plex)+ "$" + str(exag)
qmdlparam.put(string)
qmdlhrfn.put(hderfname)
end = time.time()
mdltimig = end - start
qmdltime.put(mdltiming)
def task3(ip_matrix,qmdlvalues,qmdlparam,plex,exag,qmdltime,qmdlhrfn,hderfname):
string=""
start=0
end=0
mdltiming=0
start = time.time()
tmpmdl3 = TSNE(perplexity=plex,early_exaggeration=exag, n_components=2,random_state=0,verbose=1)
qmdlvalues.put(tmpmdl3.fit_transform(ip_matrix))
string = str(plex)+ "$" + str(exag)
qmdlparam.put(string)
qmdlhrfn.put(hderfname)
end = time.time()
mdltimig = end - start
qmdltime.put(mdltiming)
def task4(ip_matrix,qmdlvalues,qmdlparam,plex,exag,qmdltime,qmdlhrfn,hderfname):
string=""
start=0
end=0
mdltiming=0
start = time.time()
tmpmdl4 = TSNE(perplexity=plex,early_exaggeration=exag, n_components=2,random_state=0,verbose=1)
qmdlvalues.put(tmpmdl4.fit_transform(ip_matrix))
string = str(plex)+ "$" + str(exag)
qmdlparam.put(string)
qmdlhrfn.put(hderfname)
end = time.time()
mdltimig = end - start
qmdltime.put(mdltiming)
if __name__ == "__main__":
# print ID of current process
print("ID of process running main program: {}".format(os.getpid()))
# print name of main thread
print("Main thread name: {}".format(threading.main_thread().name))
dense_mx2 = dense_mx
dense_mx3 = dense_mx
dense_mx4 = dense_mx
qmdlvl = queue.Queue()
qmdlch = queue.Queue()
qmdltme = queue.Queue()
qmdlhdrfname = queue.Queue()
perplex = 200
# creating threads
exag=10
t1 = threading.Thread(target=task1,args=(dense_mx,qmdlvl,qmdlch,perplex,exag,qmdltme,qmdlhdrfname,"#perplex: 200 early exag: 10 timing: В моем предыдущем коде есть несоответствия параметров, которые были исправлены, и полный рабочий код представлен ниже.
Я сохранил вывод t-SNE прямо в очередь и получил его в основном потоке. Следующим шагом будет преобразование этого в пул потоков и подклассификацию.
[110]plex200_exag10.csv"), name='t1')
exag=30
t2 = threading.Thread(target=task2,args=(dense_mx2,qmdlvl,qmdlch,perplex,exag,qmdltme,qmdlhdrfname,"#perplex: 200 early exag: 30 timing: В моем предыдущем коде есть несоответствия параметров, которые были исправлены, и полный рабочий код представлен ниже.
Я сохранил вывод t-SNE прямо в очередь и получил его в основном потоке. Следующим шагом будет преобразование этого в пул потоков и подклассификацию.
[110]plex200_exag30.cv"), name='t2')
exag=50
t3 = threading.Thread(target=task3,args=(dense_mx3,qmdlvl,qmdlch,perplex,exag,qmdltme,qmdlhdrfname,"#perplex: 200 early exag: 50 timing: В моем предыдущем коде есть несоответствия параметров, которые были исправлены, и полный рабочий код представлен ниже.
Я сохранил вывод t-SNE прямо в очередь и получил его в основном потоке. Следующим шагом будет преобразование этого в пул потоков и подклассификацию.
[110]plex200_exag50.csv"), name='t3')
exag=100
t4 = threading.Thread(target=task4,args=(dense_mx4,qmdlvl,qmdlch,perplex,exag,qmdltme,qmdlhdrfname,"#perplex: 200 early exag: 100 timing: В моем предыдущем коде есть несоответствия параметров, которые были исправлены, и полный рабочий код представлен ниже.
Я сохранил вывод t-SNE прямо в очередь и получил его в основном потоке. Следующим шагом будет преобразование этого в пул потоков и подклассификацию.
[110]plex200_exag100.cv"), name='t4')
# starting threads
t1.start()
t2.start()
t3.start()
t4.start()
# wait until all threads finish
t1.join()
t2.join()
t3.join()
t4.join()
while True:
if qmdlvl.empty():
print("Queue closed. Exiting thread.")
break
try:
item1 = qmdlvl.get(timeout=.5)
item2 = qmdlch.get(timeout=.5)
item3 = qmdltme.get(timeout=.5)
header,fname = qmdlhdrfname.get(timeout=.5).split(')
except:
continue
write_tsne_op(item1,fname,header)
Кроме того, к предложениям Ted Percival, Вы могли попытаться использовать PHPMailer для создания электронных писем для Вас вместо того, чтобы вручную создать заголовки. Я использовал этот класс экстенсивно и не испытал любые затруднения из-за электронной почты, отклоняемой как спам Yahoo или кем-либо еще.
Я просто успешно попробовал следование из моей учетной записи Веб-хостинга Yahoo!:
$email = "me@site.com"; $subject = "Simple test"; $body = "Simple test"; $header = "From: site \r\n"; $header .= "To: $name \r\n"; $header .= "Subject: $subject\r\n"; $header .= "Reply-To: site " . "\r\n"; $header .= "MIME-VERSION: 1.0\r\n"; $header .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; $phpversion = phpversion(); $header .= "X-Mailer: PHP v$phpversion\r\n"; mail($email,$subject,$body,$header);
Однако у Вас есть некоторое дублирование в Вашем заголовке, необходимо только должны быть сделать следующее:
$email = "me@site.com"; $subject = "Simple test"; $body = "Simple test"; $header = "From: site \r\n"; $header .= "MIME-VERSION: 1.0\r\n"; $header .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; $phpversion = phpversion(); $header .= "X-Mailer: PHP v$phpversion\r\n"; mail($email,$subject,$body,$header);
Предложения Ted's хороши, как Tim, но единственный способ, которым я когда-либо мог надежно получить электронную почту до Yahoo/Hotmail/и т.д., состоит в том, чтобы использовать ГРУШЕВЫЕ почтовые классы. Попробуйте их и (предположение, что Ваш сервер в порядке), я могу в значительной степени гарантировать, что он будет работать.
Проверьте rfc 822 и rfc 2045 для почтового формата. Я нахожу почтовый класс Python действительно легким работать с. Я предполагаю, что ГРУША php делает то же (согласно более ранним письмам). Также заголовок и тело разделяются "\r\n\r\n", не уверенным, если Ваш код автоматически вставляет это, но можно попытаться добавить это к заголовку.
Я не думаю, что DK/SPF мог бы быть необходимым (так как существует много веб-серверов там без поддержки DK/SPF). Может быть много факторов, которые могли бы заставлять это быть заблокированным (по крайней мере 10K различные критерии и методы.. p0f, greylisting, greylisting, помещая в черный список и т.д. и т.д.). Удостоверьтесь, что Ваша электронная почта правильно отформатирована (это имеет большое значение). Изучите библиотеки, которые генерируют полный заголовок для Вас.. тем путем у Вас есть наименьшее количество возможностей делания любой ошибки.
У Ted и Tim есть превосходные предложения. Как делает Shabbyrobe. Мы используем PHPMailer и не имеем никаких проблем со спам-фильтрами.
Одна вещь отметить состоит в том, что много спам-фильтров будут считать не наличие текстовой версии против Вас при использовании формата MIME. Вы могли добавить все заголовки и текстовую версию сами, или просто позволить PHPMailer, или ГРУШЕВАЯ почтовая библиотека заботятся об этом для Вас. Наличие текстовой версии может или не может помочь, но это - хорошая практика и удобный для пользователя.
Я понимаю, что Ваш пример кода просто, что - образец, но это стоит сказать: просто никогда не отбрасывайте пользователя, предоставленного данным в Ваши почтовые заголовки. Удостоверьтесь, что Вы проверяете это, это - данные, которые Вы ожидаете. Это тривиально для превращения php почтового сценария в открытое реле, и никто не хочет это.
Кроме того, к предложениям Ted Percival, удостоверьтесь, что IP-адрес, из которого прибывает электронная почта, является законным источником для электронной почты согласно записи SPF site.com. Если site.com не имеет записи SPF, добавляя одну (который позволяет рассматриваемый IP-адрес, конечно) может помочь получить электронные письма прошлые спам-фильтры.
И если абсолютно должны использовать HTML в Вашем электронном письме, удостоверьтесь, что Вы также включаете версию простого текста также; Вы использовали бы тип контента "многослойных/альтернативных" вместо "текста/HTML".
Добавить запись SPF очень просто. Вам стоит попробовать.
Это для Dreamhost и googlemail Вы также должны указать свой IP-адрес веб-сервера (в моем случае это строка перед googlemail) Последняя строка говорит серверу выполнить мягкое отклонение (пометить как спам, но не удалять). Я использую его вместо "-" (удалить), потому что в документации Google сказано: -)
Это запись TXT v = spf1 ip4: 64.111.100.0/24 ip4: 66.33.201.0/24 ip4: 66.33.216.0/24 ip4: 208.97.132.0/24 ip4: 208.97.187.0/24 ip4: 208.113.200.0/24 ip4: 208.113.244.0/24 ip4: 208.97.132.74 ip4: 67.205.36.71 включают: aspmx.googlemail.com mx ~ all
Надеюсь, это поможет
Также существует вероятность, что sendmail (который находится под функцией PHP mail ()) потребуются дополнительные параметры. Если у вас есть проблема с возвращаемыми заголовками (такими как Return-Path), которые не заданы так, как вы их задали, вам может потребоваться использовать пятый параметр mail (). Пример:
mail('recipient@domain.com', 'Subject', $mail_body, $headers, " -f sender@domain.com");
Есть еще одно свидетельство того, что настоящий ванильный sendmail может иметь проблемы с этим! Надеюсь, у вас есть postfix в качестве базовой поддержки mail () PHP на вашем целевом сервере.