标签: queue

C#:将对象添加到队列时触发事件

我需要能够在将对象添加到a时触发事件Queue<Delegate>.

我创建了一个扩展的新类Queue:

public delegate void ChangedEventHandler(object sender, EventArgs e);

public class QueueWithChange<Delegate> : Queue<Delegate>
{
    public event ChangedEventHandler Changed;

    protected virtual void OnChanged(EventArgs e) {
        if (Changed != null)
        {
            Changed(this, e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后从另一个类附加事件,如:

QueueWithChange<TimerDelegate> eventQueue = new QueueWithChange<TimerDelegate>();

//

eventQueue.Changed += new ChangedEventHandler(delegate(object s, EventArgs ex) {
    //This event is not being triggered, so this code is unreachable atm...and that is my problem

    if (eventQueue.Count > 0)
    {
        eventQueue.Dequeue().Invoke(new DispatcherTimer() { Interval = …
Run Code Online (Sandbox Code Playgroud)

c# queue events delegates

18
推荐指数
2
解决办法
3万
查看次数

用PHP和MySQL实现一个简单的队列?

我有一个PHP脚本,它从数据库中检索行,然后根据内容执行工作.这项工作可能很耗时(但不一定计算成本很高),因此我需要允许多个脚本并行运行.

数据库中的行看起来像这样:

+---------------------+---------------+------+-----+---------------------+----------------+
| Field               | Type          | Null | Key | Default             | Extra          |
+---------------------+---------------+------+-----+---------------------+----------------+
| id                  | bigint(11)    | NO   | PRI | NULL                | auto_increment |
.....
| date_update_started | datetime      | NO   |     | 0000-00-00 00:00:00 |                |
| date_last_updated   | datetime      | NO   |     | 0000-00-00 00:00:00 |                |
+---------------------+---------------+------+-----+---------------------+----------------+
Run Code Online (Sandbox Code Playgroud)

我的脚本当前选择具有最早日期的行date_last_updated(在完成工作后更新)并且不使用date_update_started.

如果我现在要并行运行脚本的多个实例,他们会选择相同的行(至少在某些时候),并且将完成重复的工作.

我正在考虑做的是使用事务来选择行,更新date_update_started列,然后WHERE向SQL语句添加一个条件,选择行只选择date_update_started大于某个值的行(以确保另一个脚本不起作用)在上面).例如

$sth = $dbh->prepare('
    START TRANSACTION;
    SELECT * FROM table WHERE date_update_started …
Run Code Online (Sandbox Code Playgroud)

php mysql sql queue pdo

18
推荐指数
2
解决办法
6386
查看次数

.NET上的线程安全阻塞队列实现

我正在寻找.NET的线程安全阻塞队列的实现.通过"线程安全阻塞队列"我的意思是: - 线程安全访问队列,其中Dequeue方法调用阻塞一个线程,直到其他线程放入(Enqueue)某个值.

到目前为止,我发现了这个:http://www.eggheadcafe.com/articles/20060414.asp (但它适用于.NET 1.1).

有人可以评论/批评这种实施的正确性.或建议另一个.提前致谢.

.net queue collections multithreading

17
推荐指数
2
解决办法
2万
查看次数

锁定免费队列 - 单一生产者,多个消费者

我正在寻找一种方法来实现支持单个生产者和多个消费者的无锁队列数据结构.我看过Maged Michael和Michael Scott(1996)的经典方法,但他们的版本使用链表.我想要一个使用有界循环缓冲区的实现.什么东西使用原子变量?

另外,我不确定为什么这些经典方法是为需要大量动态内存管理的链表设计的.在多线程程序中,所有内存管理例程都是序列化的.我们不是通过将它们与动态数据结构结合使用来破坏无锁方法的好处吗?

我试图在英特尔64位架构上使用pthread库在C/C++中编写代码.

谢谢Shirish

c++ queue atomic lock-free

17
推荐指数
3
解决办法
1万
查看次数

Java BlockingQueue与批处理?

我对与Java BlockingQueue相同的数据结构感兴趣,但它必须能够批处理队列中的对象.换句话说,我希望生产者能够将对象放入队列,但是使用消费者块,take()直到队列达到一定的大小(批量大小).

然后,一旦队列达到批量大小,生产者必须阻止,put()直到消费者已经消耗了队列中的所有元素(在这种情况下,生产者将再次开始生产并且消费者块直到再次到达批次).

是否存在类似的数据结构?或者我应该写它(我不介意),如果有什么东西,我只是不想浪费我的时间.


UPDATE

也许稍微澄清一下事情:

情况总是如下.可以有多个生产者向队列添加项目,但永远不会有多个消费者从队列中获取项目.

现在,问题是这些设置有多个并行和串行.换句话说,生产者为多个队列生产物品,而消费者本身也可以是生产者.这可以更容易地被视为生产者,消费者 - 生产者和最终消费者的有向图.

生产者应该阻塞直到队列为空(@Peter Lawrey)的原因是因为每个都将在一个线程中运行.如果你让它们只是在空间可用的情况下生成,你最终会遇到太多线程试图同时处理太多东西的情况.

也许将它与执行服务相结合可以解决问题?

java queue producer-consumer blockingqueue

17
推荐指数
1
解决办法
1万
查看次数

如何删除服务代理队列中的消息

我想在SQL Server Management Studio中清除队列,但我不想删除整个队列中的队列内容(消息).

谢谢,塞纳

sql-server queue service-broker

17
推荐指数
3
解决办法
5万
查看次数

python线程可以访问命名空间中的变量吗?

我有一个脚本创建一堆线程,运行程序使用线程从队列中运行任务,并从每个线程返回一些东西.我想计算其中有多少成功返回,所以我设置一个变量"successful = 0"并在每次队列报告任务成功完成时递增它.

但是,我得到"UnboundLocalError:局部变量'成功'在分配之前被引用"

这是怎么回事?

这是一些示例代码:

successful = 0

q = Queue(200)
for i in range(100):
    t=Thread(target=foo)
    t.daemon=True
    t.start()
def foo():
    while True:
        task=q.get()
        #do some work
        print task
        successful+=1 # triggers an error
        q.task_done()
for i in range(100):
    q.put("Foo")
q.join()
print successful
Run Code Online (Sandbox Code Playgroud)

python queue multithreading scope

17
推荐指数
2
解决办法
2万
查看次数

Java:ArrayBlockingQueue与LinkedBlockingQueue

我认为,在大多数情况下,ArrayBlockingQueue表现会比表现更好LinkedBlockingQueue.但是,当数组中总有足够的空间时就是这种情况......如果它已经满了,那么它是否会表现得如此之好是不可预测的,因为它会阻塞试图将数据推入队列的线程. .

所以,我的问题是:是否有任何中间实施BlockingQueue?说,一个ArrayListBlockingQueue或一个BucketListBlockingQueue?类似于数组列表的东西,以便队列可以动态增加容量,同时仍然可以通过使用数组最终存储数据获得合理的好处?

java queue multithreading synchronization

17
推荐指数
2
解决办法
2万
查看次数

Laravel Artisan CLI安全地停止守护程序队列工作程序

为了处理大量的工作,我运行可变数量的队列工作者,具体取决于完成的工作量.我不想在完成我们认为合适的时间段内完成需要完成的工作之外运行更多的工人.

目前,我启动了5个守护程序队列工作程序用于测试目的,但是在生产中,这个数字可能介于25到100名工作人员之间,可能更多.我知道在部署时,我必须首先通过使用框架将框架置于维护模式来停止队列工作php artisan down,因为该--daemon标志导致框架仅在工作程序启动时加载,因此新代码在部署期间不会生效工人重新开始.

如果由于某种原因我需要停止工作,我可以将应用程序置于维护模式,php artisan down这将导致工作人员在完成当前工作(如果他们正在工作)之后死亡.但是,有时我可能会在不将整个应用程序置于维护模式的情况下杀死工作人员.

有没有一种安全的方法来阻止工人继续处理他们当前的工作,然后在不将整个应用程序置于维护模式的情况下死亡?

基本上我需要的是一个php artisan queue:stop,表现得像php artisan queue:restart,但一旦完成工作就不会重启工人.

我在那里期待有一个类似的php artisan queue:stop命令可以做到这一点,但似乎并非如此.

使用ps aux | grep php我能够为工作者获取进程ID,并且我可以通过这种方式终止进程,但我不想在处理作业的过程中终止进程.

谢谢.

php queue daemon laravel artisan

17
推荐指数
2
解决办法
2万
查看次数

使用Laravel队列时如何避免作业数据库表锁问题?

我正在使用Laravel 5.1.

队列用于在多个系统之间进行数据获取/同步.

我使用数据库驱动程序,3"artisan queue:work --daemon"进程一直在运行.

作业由系统用户和调度程序(cron)分派.三个队列用于确定作业的优先级.

一切似乎工作得很好 - 作业表充满了记录,系统负责处理它们并删除已完成的记录.

但是一段时间后锁定问题开始干扰:

SQLSTATE [40001]:序列化失败:1213尝试获取锁定时发现死锁; 尝试重新启动事务

'RuntimeException',消息'在事务中无法交换PDO实例'.

SQLSTATE [HY000]:常规错误:1205超出锁定等待超时; 尝试重新启动事务

我还没有尝试过使用其他队列驱动程序.我真的很想留在数据库中.引擎是InnoDB,jobs表有默认结构和索引.

有没有办法解决这个问题?你的想法是什么?

值得一提的是,DB::reconnect()因为队列工作程序作为守护进程运行,所以我在内部调用我的作业类.

DispatchesJobs正如人们所期望的那样,使用特征调度作业.我不以任何其他方式干扰队列算法.

mysql queue innodb laravel laravel-5

17
推荐指数
1
解决办法
4739
查看次数