我正在设计一个系统,其中有m
个生产者和from Quartz import CGWindowListCopyWindowInfo, kCGNullWindowID, kCGWindowListOptionAll
import datetime, time
print datetime.datetime.now()
found = False
count = 0
windowName = "Hello World"
while 1:
list = CGWindowListCopyWindowInfo(kCGWindowListOptionAll, kCGNullWindowID)
time.sleep(0.2)
for a in list:
try:
if a['kCGWindowName'] == windowName:
print "**** yippee *****"
print "window found"
print a
found = True
break
except:
pass
if found == True:
break
print "NOT FOUND", count
count+=1
print datetime.datetime.now()
个消费者,其中n和m是数字,n!= m。
我想以这样的方式设计系统,
例如:在java中,如果我使用同步关键字,那么它将阻止相应的调用者。
我不确定应该使用什么数据结构和算法来实现这个系统。
有人能为我提供帮助/指示吗?
答案 0 :(得分:2)
你可能想要像ConcurrentLinkedQueue这样的东西。这个想法是你创建一个队列。 n个生成器中的每一个都将工作项添加到队列中,每个m个使用者从队列中读取工作项。制片人只是:
while not done
create work item
add work item to queue
消费者就是这么简单:
while not done
get next work item from queue
process work item
ConcurrentLinkedQueue
方法处理添加和删除项目,根据需要与其他生产者和消费者同步。
唯一真正的缺点是你必须轮询队列以查看是否有项目。因此,您可能希望每当项目添加到队列时都会触发自动重置事件。例如:
add work item to queue
set ItemAvailable event
消费者会轮询队列,如果没有可用的项目,请等待事件:
while not done
while ((item = queue.poll) == null)
wait on ItemAvailable event
process item
看看我链接的示例。这真的不难用。
答案 1 :(得分:1)
根据你需要做多少繁重的工作,以及你的解决方案需要扩展的程度,RxJava有一个陡峭的学习曲线,但是一旦你超越了它,它可能是最优雅,扩展和执行解决方案。
在不同的线程中运行所有生成器,将它们与Merg()
组合,将消费者移动到具有.observeOn(Scheduler.newThread())
的未绑定缓冲区上的自己的线程。
如果您需要在多个系统上并行运行的内容,请查看mapreduce。
如果您需要完整光谱的另一端(简单),只需坚持ConcurrentQueue即可。这并不支持多播,但至少解决了生产者方面的问题。
答案 2 :(得分:0)
你想要一种方法,其中每个动作都是原子的和不可中断的,所以是的,在我看来,最好的方法是在方法上使用synchronized modifier来设置锁。
另一个有趣的方法是使用原子变量 - > http://baptiste-wicht.com/posts/2010/09/java-concurrency-atomic-variables.html
这取决于您在这些生产者/消费者结构中的数据。
答案 3 :(得分:0)
使用wait()和notify()进行线程通信,你可以创建n
生成器和m
消费者线程
class Q{
int n;
boolean value=false;
synchronized int get() {
if(!value)
try { wait(); }
catch(InterruptedException e)
{ System.out.println("thread interrupted"); }
System.out.println("Got : "+n);
value=false;
notify();
return n;}
synchronized void put(int n) {
if(value)
try { wait();}
catch(InterruptedException e)
{ System.out.println("thread interrupted"); }
this.n=n;
value=true;
System.out.println("Put : "+n);
notify();}}
class Producer implements Runnable{
Q q;
Producer(Q q){
this.q=q;
new Thread(this,"Producer").start();}
public void run(){
int i=0;
while(true)
{
q.put(i++);}}
}
class Consumer implements Runnable{
Q q;
Consumer(Q q) {
this.q=q;
new Thread(this,"Consumer").start();}
public void run(){
while(true)
{
q.get();
}}}
class PCFixed
{
public static void main(String ar[])
{
Q q=new Q();
new Producer(q);
new Consumer(q);
System.out.println("PRESS CONTROL-C TO STOP");
}
}
它会变为无穷大,根据您的要求进行更改