new_list = my_list[:]
new_list = my_list
Попытайтесь это понять. Предположим, что my_list находится в памяти кучи в месте X, то есть my_list указывает на X. Теперь, назначив new_list = my_list
, вы даете new_list указывать на X. Это называется мелкой копией.
Теперь, если вы назначили new_list = my_list[:]
, вы просто копируете каждый объект my_list в new_list. Это известно как Deep copy.
Другой способ, которым вы можете это сделать:
new_list = list(old_list)
import copy
new_list = copy.deepcopy(old_list)
Я предполагаю, что вы используете библиотеку c #? (но, тем не менее, я думаю, что другие имеют аналогичное событие).
Вы можете сделать следующее:
public class MyRabbitConsumer
{
private IConnection connection;
public void Connect()
{
connection = CreateAndOpenConnection();
connection.ConnectionShutdown += connection_ConnectionShutdown;
}
public IConnection CreateAndOpenConnection() { ... }
private void connection_ConnectionShutdown(IConnection connection, ShutdownEventArgs reason)
{
}
}
Это пример этого, но заметный ответ - вот что привело меня к этому.
var factory = new ConnectionFactory
{
HostName = "MY_HOST_NAME",
UserName = "USERNAME",
Password = "PASSWORD",
RequestedHeartbeat = 30
};
using (var connection = factory.CreateConnection())
{
connection.ConnectionShutdown += (o, e) =>
{
//handle disconnect
};
using (var model = connection.CreateModel())
{
model.ExchangeDeclare(EXCHANGE_NAME, "topic");
var queueName = model.QueueDeclare();
model.QueueBind(queueName, EXCHANGE_NAME, "#");
var consumer = new QueueingBasicConsumer(model);
model.BasicConsume(queueName, true, consumer);
while (!stop)
{
BasicDeliverEventArgs args;
consumer.Queue.Dequeue(5000, out args);
if (stop) return;
if (args == null) continue;
if (args.Body.Length == 0) continue;
Task.Factory.StartNew(() =>
{
//Do work here on different thread then this one
}, TaskCreationOptions.PreferFairness);
}
}
}
Несколько замечаний об этом.
Я использую # для темы. Это захватывает все. Обычно вы хотите ограничить тему.
Я устанавливаю переменную с именем «stop», чтобы определить, когда процесс должен завершиться. Вы заметите, что цикл работает вечно до тех пор, пока эта переменная не будет истинна.
Dequeue ждет 5 секунд, а затем выходит без получения данных, если нет нового сообщения. Это делается для того, чтобы мы прослушивали эту стоп-переменную и фактически уходили в какой-то момент. Измените значение по своему вкусу.
Когда приходит сообщение, я создаю код обработки в новом потоке. Текущий поток резервируется только для прослушивания сообщений rabbitmq, и если обработчик занимает слишком много времени для обработки, я не хочу, чтобы он замедлял другие сообщения. Это может потребоваться или не понадобиться в зависимости от вашей реализации. Однако будьте осторожны с написанием кода для обработки сообщений. Если вам понадобится минута, и вы получаете сообщения в суб-второй раз, у вас не хватит памяти или, по крайней мере, на серьезные проблемы с производительностью.