Форум сайта python.su
как в аське. прошу прощения за формулировку.
Ладно, фиг с ним , вот код, если поможет буду рад.
Сервер:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket,thread
HOST = ""
PORT1 = 1111
a=0
users = []
susers =[]
conect= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conect.bind((HOST, PORT1))
myIP1= conect.getsockname()
def OUTme():
global users,l
while 1:
inp = raw_input("")
if inp == "print l":
print l
elif inp == "print users":
for x in users:
print x[0].encode('UTF-8')
elif inp == "send":
sms = raw_input("sms:")
sms = "From ADMIN: " + sms
for x in users:
x[1].send(sms)
else:
pass
def lsttostr(lst):
str = ""
for x in lst:
str = str + x[0] + ","
return str
def get_user(a):
global l,users
l = len(users)
l = str(l)
print "на сервере ",l," пользователей"
print"Прослушиваю порт"
conect.listen(1)
sub,ip = conect.accept()
print "какоето шевеление"
name = sub.recv(1024)
print name,ip , "Присоеденился к серверу"
sub.send(l)
print l
if l =="0":
users.append([name,sub,ip])
susers.append([name,sub,ip])
else:
strusers = lsttostr(users)
sub.send(strusers)
ans = sub.recv(1024)
if ans =="1":
user2 = sub.recv(1024)
print "Принято"
user2 = int(user2)
users[user2][1].send("Кто-то к вам присоеденился")
print "отправлено 1"
sub.send("Вы присоеденились")
print "отправлено 2 "
thread.start_new(SMS,(sub,users[user2][1]))
thread.start_new(SMS,(users[user2][1],sub))
users[user2-1:user2+1]=[]
susers.append([name,sub,ip])
print "2 пользователя соеденено"
else:
users.append([name,sub,ip])
susers.append([name,sub,ip])
get_user(a)
def SMS(user1,user2):
while 1:
sms = user1.recv(1024)
if sms:
user2.send(sms)
thread.start_new(get_user,(a,))
thread.start_new(get_user,(a,))
thread.start_new(get_user,(a,))
OUTme()
conect.close()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket,thread
a=0
HOST = "vsrmischat.homeunix.com"
PORT=1111
conect = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conect.connect((HOST,PORT))
print "connect to ", PORT
myIP= conect.getsockname()
name = raw_input("What is your nsme? ")
conect.send(name)
l = conect.recv(1024)
print l
l=int(l)
def strtolist(string):
lst = []
i=0
k=0
n=0
while k!= len(string):
if string[k] == ",":
lst.append(str(i) + " " + string[n:k])
n=k+1
i = i+1
if k ==len(string)-1:
lst.append(str(i) + " " + string[n:k+1])
k = k+1
return lst
def IN(a):
while 1 :
sms = conect.recv(1024)
if sms:
print sms
def OUT(a):
while 1:
sms = raw_input("")
conect.send(sms)
def ch():
u = raw_input("Input number of user You want to speek")
try: u = int(u)
except ValueError:
print"Try again"
u = ch()
if u in xrange(0,l):
pass
else:
print"Try again"
u = ch()
u = str(u)
return u
def Ans():
ans = raw_input("If you want to choose user to speak press 1, if you want to wait wile sobe body chose youpress2")
if ans =="1" or ans == "2":
pass
else:
print"Try again"
ans = Ans()
ans = str(ans)
return ans
if l==0:
print"You is only one user, whait some body"
sms = conect.recv(1024)
if sms:
print sms
print" _-_-_-_-_-_--___--__--__"
else:
print"Sorry, maybe server is DOWN"
exit()
else:
print "there are users, a waiting you to chat them"
us = conect.recv(1024)
lstus = strtolist(us)
for x in lstus:
print x
ans = Ans()
conect.send(ans)
if ans =="1":
u = ch()
conect.send(u)
sms = conect.recv(1024)
if sms:
print sms
print" _-_-_-_-_-_--___--__--__"
else:
print "Sorry, maybe server is DOWN"
exit()
else:
print"SO... Wait..."
sms = conect.recv(1024)
if sms:
print sms
print" _-_-_-_-_-_--___--__--__"
else:
print"Sorry, maybe server is DOWN"
exit()
thread.start_new(IN,(a,))
OUT(a)
conect.close()
Офлайн
CryptSpiritВы неправы в подходе. Какой смысл профилировать никому не нужные циклы? Вот возьмите и попрофилируйте реальную программу, да хоть и эту. Я сильно удивлюсь, если += там сильно повлияет на производительность. А, как известно, профайлить нужно то, что влияет. А += выразительнее, только поэтому я его и использовал. Но уж если мне профайлер покажет, что мой сервер из-за этой конструкции тормозит, то я поменяю ее на другую. Только в этом случае, а не из-за того, что она медленнее сама по себе. Вот так.
… Я новичке и при всем разнообразии стилей написания кодов меня реально волнует только производительность. Поправте меня если я не прав.
Офлайн
EdЧто то я опять туплю. У меня логическая цепочка:
не из-за того, что она медленнее сама по себе
EdПодход получить производительный код. Зная что Питон не очень уж и быстр использовать уловки для того что бы не потерять и той не большой скорости я считаю рациональным. А использовать эти конструкции ибо они “эстетичнее” смотряться мне кажиться излишней. Но это имхо. Просто ну не понимаю. Пусть даже одна из задач Питона читабельный для других людей код но какой программист будет вредить своей программе?
Вы неправы в подходе
EdПочитав это чтиво от некоторых абзацев стало тошнить. Напомнило правила форматирования в Ворде. Я пишу программу, а не оформляю рекламный буклет. Особенно отвратительно стало от отступов. Опять же имхо программирование это алгоритм, а не форматирование текста. Какая разница как я буду описывать импорты? В начале я думал что Питон направлен на уменьшения размера конструкция, а здесь в точности да наоборот.
http://www.python.org/dev/peps/pep-0008/
Alex_KutsanА как сие было проверено? По коду что то не похоже на то.
Но в целом программа работает, с неограниченым количеством клиентов
Alex_KutsanЭто не странно.
проблемой. при отключении кллиента. у сервера Тред выдаёт ошибку
Офлайн
CryptSpiritВсе относительно, простите за банальщину.
Подход получить производительный код. Зная что Питон не очень уж и быстр использовать уловки для того что бы не потерять и той не большой скорости я считаю рациональным. А использовать эти конструкции ибо они “эстетичнее” смотряться мне кажиться излишней. Но это имхо. Просто ну не понимаю. Пусть даже одна из задач Питона читабельный для других людей код но какой программист будет вредить своей программе?
CryptSpiritЭти правила есть в каждом языке, даже на проекты могут создаваться свои “соглашения о кодировании”. Это очень полезно в групповой разработке.
Почитав это чтиво от некоторых абзацев стало тошнить. Напомнило правила форматирования в Ворде. Я пишу программу, а не оформляю рекламный буклет. Особенно отвратительно стало от отступов. Опять же имхо программирование это алгоритм, а не форматирование текста. Какая разница как я буду описывать импорты?
Офлайн
CryptSpiritЯ верю, что по сравнению с a = a + 1 a+=1 тормозит. Но в реальном приложении это скорее всего будет несущественно, поскольку основное время поглощается более медленными вещами. Вот, например, вы отпрофайлили свой сервер и увидели, что 99% времени у вас жрет создание вашего объекта треда и запуск его метода run. А конструкция a+=1 есть 0.00002%. Это все условно, естетсвенно. Вы поменяете ее на a = a +1 и увеличите производительность этой конструкции в 2 раза, а производительность приложения на 0.00001%. И какой в этом смысл? Ускорять имеет смысл то, что наиболее медленно. Питон - это не ассемблер и в нем производительность не всегда важна. Для меня, например, гораздо большее значение имеет читабельность кода. В 99% случаев в области, где я работаю производительности Питона хватает. Когда не хватает - беру профайлер и профилирую. Только не присваивания профилирую, а приложение в целом, находя критичные по производительности участки и ускоряя их. А вот код, написаный непонятно создает гораздо большие трудности в сопровождении. Есть у нас и такой. Пережитки прошлого, так сказать.
Что то я опять туплю. У меня логическая цепочка:
Тормозит в примере (где меняется только конструкция “присвоения”) то тормозит везде. Вопрос по профайлу как мне профайлить мой сервер (его узлы). Я хочу показать вам цифры (да если честно и сам посмотреть на них с разными изменениями).
EdЭто цель. А подход обычный для Питона, и не только - сделать работающую программу, которую не стыдно людям показать и потом профилировать ее. Не нужно профилировать неработающий код - это бесполезное занятие.
Подход получить производительный код.
Почитав это чтиво от некоторых абзацев стало тошнить.Это не чтиво, это общепринятые нормы оформления питонового кода. Меня обычно подташнивает при взгляде на код, сделанный кое-как. И смею предположить, что не только меня. А вот при взгляде на код, сделаный по тем правилам почему-то нет. Почему бы это?
Я пишу программу, а не оформляю рекламный буклет. Особенно отвратительно стало от отступов.Хм. А что с ними не так?
Опять же имхо программирование это алгоритм, а не форматирование текста. Какая разница как я буду описывать импорты?Алгоритм - это идея. Программа - это ее выражение. Это как в обычном языке. Большинству будет наплевать какие у вас мысли, если вы не сможете их выразить вслух, либо на бумаге, пользуясь общепринятыми языковыми нормами. PEP8 - это такие же общепринятые нормы.
В начале я думал что Питон направлен на уменьшения размера конструкция, а здесь в точности да наоборот.В Питоне читабельности кода придается большое значение. И это хорошо. Это делает программы на питоне понятными и красивыми, а программирование - приятным. И таки да - чаще программы на Питоне короче аналогов на других языках.
Офлайн
EdНет. Я занимаюсь панорамированием с 9 класса. Потом был универ (химическая специальность). Так сложилость что к концу учебы у меня появилась работа связаная с компьютерами. Я уже второй год использую линукс. А теперь не сложно догадаться в каких целях мне нужен Питон. Контроль версий это хорошо но не в моем случае. потому я вас не понял.
Вы пользуетесь системой контроля версий для хранения вашего кода?
EdДа. И рад что получил больше чем хотел (а именно задал наболевшие вопросы и узнал о этих правилах написания кода).
В конце концов вы сами попросили оценить ваш код
Офлайн
Ну вот и хорошо, раз поняли. Будет желание продолжить - милости просим. После pylint rate > 9 :)
Офлайн
CryptSpiritПочему же не похоже, очень даже похоже. Сначала идут 3 треда get_user( одновременно к серверу могут подрубится и выбирать себе собеседника 3 человека) как только они быбирут собеседника то создастся новый тред общения этих 2 клиентов. А тред get_user освободится и будет ждать новых людей. А проверено было сие на 1 машине, включил сервер. и стал включть клиенты. пока мне не надоело, навключал много, уж простите но неограниченое количество включитья не мог. Но опять же смотрите выше, как только клиент выбрал собеседника создаётся НОВЫЙ тред их общения. Так что сколько пар Клиентов на сервере столько и тредов.
А как сие было проверено? По коду что то не похоже на то
Офлайн
Alex_KutsanЕсли вы читали посты выше основная проблема создание тредов. В этом ограничение. Если вы напишите клиент который автоматом подрубит определенное число клиентов к серверу то сможете еще иуказать цифорки. Смотрите мой код. Там пример клиента для краш тестов. У меня узким местом оказались треды свыше 1021 машины посылали меня на…
Клиентов на сервере столько и тредов
Офлайн
Хммм, тоггда могу предложить неограниченое кол-во клиентов с 1 тредом. НО! все клиенты будут общятся так сказать как в старых добрых чатах. Тоесть если кто-то что-то отправил , то получат все. и сервер не может толком индентифицировать клиента.
Щяс попробую наваять такой код, но за работо способность не ручаюсь
сервер:
#!/usr/bin/env python
import socket,thread
HOST = ""
PORT = 1111
a=0
users = []
conect= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conect.bind((HOST, PORT))
myIP1= conect.getsockname()
def get_user(a):
while 1:
conect.listen(1)
sub,ip = conect.accept()
name = sub.recv(1024)
users.append([name,sub,ip])
print name , "connected to us"
OUT("connected to us",name)
def IN(a):
while 1:
name = conect.recv(1024)
sms = conect.recv(1024)
if sms:
OUT(sms,name)
print name, " ", sms
def OUT(sms,name):
for x in users:
x[0].send(name)
x[0].send(sms)
def OUTme():
sms = raw_input("")
OUT(sms,"Admin")
thread.start_new(get_user,(a,))
thread.start_new(IN,(a,))
OUTme()
conect.close()
#!/usr/bin/env python
import socket,thread
HOST = "localhost"
PORT=1111
conect = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conect.connect((HOST,PORT))
print "connect to ", PORT
myIP= conect.getsockname()
name = raw_input("Input your name")
conect.send(name)
a=0
print name,"Chat is begin"
def OUT(a):
while 1:
sms = raw_input("")
conect.send(name)
conect.send(sms)
def IN(a):
fname = conect.recv(1024)
fsms = conect.recv(1024)
if fsms:
print fname, " " , fsms
thread.start_new(IN,(a,))
OUT(a)
conect.close()
Офлайн