У меня есть мой сервер python baseHTTPServer, который обрабатывает почтовые запросы. Я использовал ThreadingMixIn, и теперь он открывает поток для каждого соединения. Я хочу выполнить несколько многопоточных действий, таких как: 1. Мониторинг успешных/неудачных действий подключения, добавив 1 к счетчику для каждого. Мне нужен замок для этого. Мой счетчик находится в глобальном масштабе того же файла. Как я могу это сделать? 2. Я хочу обрабатывать какую-то очередь и записывать ее в файл, где содержимое очереди представляет собой набор строк, написанных из разных потоков, который просто отправляет некоторую информацию для проблем с протоколированием. Как это можно сделать? Я не могу этого сделать, поскольку моя потоковая обработка выполняется «за кадром», так как каждый раз Im в do_POST (..) метод, Im уже в другом потоке.Поддержание файла журнала из нескольких потоков в Python
Succcessful_Logins = 0
Failed_Logins = 0
LogsFile = open(logfile)
class httpHandler(BaseHTTPRequestHandler):
def do_POST(self):
..
class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
pass
server = ThreadingHTTPServer(('localhost', PORT_NUMBER), httpHandler)
server.serve_forever()
Это небольшой хрупкий мой сервер. Еще одна вещь, которая беспокоит меня - это лицо, с которым я хочу сначала отправить ответ отклика обратно клиенту, и только после этого возможно получить задержку из-за механизма блокировки или чего-то еще.
Но если numSuccess является переменной класса, он создается снова и снова для каждого нового соединения (= поток), я ошибаюсь? О блокировке мьютекса, могу ли я обработать его после того, как я вернусь с моего do_POST, чтобы не откладывать ответ? – buddy123
* Экземпляры * переменные для каждого экземпляра, а переменные * class * - для каждого класса. Таким образом, numSuccess создается только один раз для всей программы. [это сообщение в блоге] (http://timothyawiseman.wordpress.com/2012/10/06/class-and-instance-variables-in-python-2-7/) содержит более подробную информацию. Я не знаю, можете ли вы отложить его до тех пор, пока do_POST, потому что я не знаю, как выглядит остальная часть вашего кода. Однако время, необходимое для блокировки и увеличения, должно быть минимальным, поэтому я не думаю, что вы заметите задержку. –
Хорошо. Спасибо, Оливер. Я прочитаю о ссылке, которую вы поделили с модулем протоколирования. во всяком случае, есть небольшое исправление, которое вам нужно сделать. В ответе, который вы мне предоставили, переменные должны быть доступны с помощью имени класса 'httpHandler', а не' self' – buddy123