0 / 0 / 2
Регистрация: 02.05.2013
Сообщений: 9

Несколько процессов в Python

14.12.2015, 22:15. Показов 1145. Ответов 3

Студворк — интернет-сервис помощи студентам
Пытаюсь написать серверное приложение на python. Возникла проблемма с несколькими процессами, с потоками такого не было (выгля. 5 раз (независимо от того, где строчка if __name__ == "__main__"), программа пытается устроить bind. После accept она выполняет, но уже в цикле ни один из потоков не видит соединения.

Вопроос два:
1) Откуда такое поведение?
2) Как с этим можно справиться?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
import socket
import sys
import os
import time
import multiprocessing
 
 
class TcpFileTransfer(multiprocessing.Process):
 
        download_started = False
        download_finished = False
        filename = None
        connected = False
 
        def __init__(self, queue, value):
                super(TcpFileTransfer, self).__init__()
                self.queue = queue
                self.fullsize = 0
                self.sent = 0
                self.value = value
                self.conn = None
                self.interrupted = False
 
        def set_socket(self, conn, addr):
                print("There is a socket in #" + str(self.value))
                self.conn = conn
                self.address = addr
 
        def dispose(self):
                self.interrupted = False
                self.download_finished = True
                self.sent = 0
                self.fullsize = 0
                self.conn.close()
 
        def download(self, snddata = None):
                if not self.download_started:
                        if snddata.endswith("continue"):
                                list_of_params = snddata.split(" ")
                                self.filename = list_of_params[1].strip()
                                print(self.filename)
                                self.sent = int(list_of_params[2])
                                self.interrupted = True
                        else:
                                self.filename = snddata[8:].strip()
 
                        if os.path.exists(self.filename):
                                self.download_started = True
                                print("Start to download " + self.filename + " from server")
                                self.fullsize = os.path.getsize(self.filename)
                        else:
                                print("File doesn't exist")
                                return False
 
                with open(self.filename,'rb') as f:
                        self.conn.settimeout(2.0)
                        f.read(self.sent)
                        try:
                                bytes_to_send = f.read(1024)
                                if bytes_to_send:
                                        self.conn.send(bytes_to_send)
                                        self.sent += 1024
                                        return True
                                else:
                                        print("Downloaded " + self.filename)
                                        self.dispose()
                        except socket.error:
                                print("Error")
                                self.interrupted = True
                                self.conn.close()
                                return False
 
        def data_recieving(self):
                self.conn.setblocking(0)
                try:
                        data = self.conn.recv(1024).decode("utf-8")
                        self.conn.setblocking(1)
                        return data
                except socket.error:
                        return None
 
        def run(self):
                self.queue.put(self.tcp_loop())
 
        def tcp_loop(self):
                #global lock
                #lock.acquire()
                while True:
                        #print("In process #" + str(self.value))
                        if self.conn != None:
                                print("I'm trying to work #" + str(self.value))
                                if not self.download_started:
                                        data = self.data_recieving()
                                        if data:
                                                print(data)
                                                if data == "Quit":
                                                        self.conn.close()
                                                        return False
                                                elif data == "Time":
                                                        localtime = str(time.asctime(time.localtime(time.time())))
                                                        self.conn.send(localtime.encode("utf-8"))
                                                elif data.startswith("echo"):
                                                        data = data[4:]
                                                        print(data)
                                                        self.conn.send(data.strip().encode("utf-8"))
                                                elif data.startswith("download"):
                                                        self.download(data)
                                                else:
                                                        print("Unrecognised command")
                                elif self.download_finished:
                                                        return False
                                else:
                                        print("Resuming" + str(self.address))
                                        self.download()
 
 
def nonbloking_connection(s):
        s.setblocking(0)
        try:
                conn, addr = s.accept()
                print("Accepted")
                return conn, addr
        except (socket.timeout, BlockingIOError):
                return None, None
 
 
#Main
if __name__ == "__main__":
        if len(sys.argv) < 1:
                print("Error. Missing param")
                sys.exit(-1)
 
port = sys.argv[1]
 
s = socket.socket()
isCorrect = True
 
try:
        s.bind(("localhost", 4000))
        print("Bind done")
except:
        print("Bind Error")
        isCorrect = False
 
if isCorrect:
        threads = []
        q = multiprocessing.Queue()
        for i in range(5):
               proc = TcpFileTransfer(q, i)
               threads.append(proc)
               proc.start()
 
        number_of_clients = 0
        s.listen(5)
        while True:
                conn, addr = nonbloking_connection(s)
                #print("In main")
                if conn:
                       print("Added " + str(addr))
                       print("Accepted")
                       threads[number_of_clients].set_socket(conn, addr)
                       number_of_clients += 1
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.12.2015, 22:15
Ответы с готовыми решениями:

Несколько процессов explorer.exe в списке процессов
С некоторого времени обнаружил несколько процесов explorer.exe, два, три, когда как. Каспер молчит. Запускать каждый проводник отдельным...

Завершить несколько процессов
Суть такая, надо завершить работу браузера по таймеру, использую следующую команду If ComboBox1.SelectedIndex = 0 Then On...

Открыть несколько процессов
вобщем появилась такая проблема, нужно по нажатию кнопки открыть несколько процессов. вот что я &quot;навоял&quot; case...

3
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
14.12.2015, 22:29
Цитата Сообщение от Nienie Посмотреть сообщение
1) Откуда такое поведение?
Постарайся внятно объяснить поведение. Из того что ты написал непонятно вобще ничего.
Цитата Сообщение от Nienie Посмотреть сообщение
2) Как с этим можно справиться?
a) См. пункт выше.
b) pdb

Добавлено через 1 минуту
тут, я смотрю с отступами большая беда.
0
0 / 0 / 2
Регистрация: 02.05.2013
Сообщений: 9
14.12.2015, 22:35  [ТС]
Так да - я пишу в основном на шарпе.
Поведение такое. Если все остальные print убрать, то поведение выходит такое (в консоли):
Bind done
Bind Error
Bind Error
Bind Error
Bind Error
Bind Error

Если не выключить, CPU на 100% занят.
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
14.12.2015, 23:28

Не по теме:

Цитата Сообщение от Nienie Посмотреть сообщение
я пишу в основном на шарпе
Да все уже поняли что и на чем ты пишешь


Приведи код в соответствии с PEP8.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.12.2015, 23:28
Помогаю со студенческими работами здесь

[Linq] Остановить несколько процессов
Возникла малюсенькая проблема, которая требует правки :)) Например нужно завершить 2 процесса, и оповестить пользователя что процесс...

Открыть несколько процессов браузера
Всем привет. Столкнулся с вопросом как открыть несколько браузеров селениум с нужными мне параметрами. Как это лучше реализовать?...

Убить несколько процессов в screen
Здравствуйте, написал бота, его требуется перезапускать каждый час, он висит на screen. Для cron написали скрипт .sh но возникла...

как запустить несколько процессов?
Доброго времени суток всем. Вопрос вот в чем. Опишу на примере. Сделал код для гирлянды. Там стоит флаг, который меняет свое значение при...

несколько процессов IEXPLORER.EXE
Здраствуйте,опять прошу вас о помощи.в процессах отображается странный процесс IEXPLORER.EXE.иногда их становится 5-10 и он грузит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru