import threading;
import queue;
import sys;
class PrimeWorker(threading.Thread):
def __init__(self,number,getNextNumber):
threading.Thread.__init__(self);
self.MyPrime=number;
self.MyGetter=getNextNumber;
self.MyQueue=queue.Queue();
def run(self):
while True:
nb=self.MyGetter();
if nb==0:
return;
if nb % self.MyPrime != 0:
break;
with primeNumbersLock:
primeNumbers.append(nb);
getNextNumber=self.MyQueue.get;
nextWorker=PrimeWorker(nb,getNextNumber);
with allThreadsLock:
allThreads.append(nextWorker);
nextWorker.start();
while True:
nb=self.MyGetter();
if nb==0:
self.MyQueue.put(0);
break;
if nb % self.MyPrime != 0:
self.MyQueue.put(nb);
class FirstWorker(threading.Thread):
def __init__(self,maxNumber):
threading.Thread.__init__(self);
self.MaxNumber=maxNumber;
self.MyQueue=queue.Queue();
def run(self):
nb=3;
getNextNumber=self.MyQueue.get;
thread=PrimeWorker(nb,getNextNumber);
with allThreadsLock:
allThreads.append(thread);
thread.start();
nb+=2;
while nb<=self.MaxNumber:
self.MyQueue.put(nb);
nb+=2;
self.MyQueue.put(0);
def getPrimeTwins(pList):
twinsList=[];
lastNb=3;
for nb in pList:
if nb==lastNb+2:
twinsList.append((lastNb,nb));
lastNb=nb;
return twinsList;
def getNumberInput():
infoStr="# Enter the largest 'number' for sieving ..."
errorStr="# Enter a 'number' > 2 OR 'e' for exit ...";
print(infoStr);
while True:
inputData=input("N> ");
inputData.strip();
if inputData.isdigit():
nb=int(inputData);
if nb>2:
userData=('number',nb);
break;
elif inputData.isalpha():
if inputData=='e':
userData=('command',inputData);
break;
print(errorStr);
return userData;
if __name__ == '__main__':
print('\n# Beginning...');
infoStr="# Largest number is: "
while True:
(taskKind,taskData)=getNumberInput();
if taskKind=='number':
print(infoStr,taskData,'\n');
allThreads=[];
allThreadsLock=threading.Lock();
primeNumbers=[2,3];
primeNumbersLock=threading.Lock();
thread=FirstWorker(taskData);
with allThreadsLock:
allThreads.append(thread);
thread.start();
for myThread in allThreads:
myThread.join();
elif taskKind=='command':
if taskData=='e':
print('# Exit by user');
sys.exit();
else:
pass;
nbPrimes=len(primeNumbers);
print('> Number of primes: ',nbPrimes);
twinsList=getPrimeTwins(primeNumbers);
nbTwins=len(twinsList);
print('> Number of twins: ',nbTwins);
print('\n> The prime twins are: ');
print(twinsList,'\n');
print('# Finished.\n');