سؤال

هذا هو سؤالي الأول هنا.أحاول تشغيل نصوص بايثون متوازية (وهي مثيلات متعددة لنفس البرنامج النصي) من جافا بشكل دوري باستخدام برنامج ScheddedThreadPoolExecutor.ما حاولت القيام به هو استخدام فئة ProcessBuilder.لاختبار المفهوم، قمت بوضع البرنامج النصي الأول في حلقة لا نهائية بينما يكتب الثاني شيئًا ما ليتم حفظه في الملف ثم يخرج.يجب أن تكون نصوص Python التي أحتاج إلى إنشائها متطابقة مع بعضها البعض، لذا حاولت تشغيل هذين البرنامجين من مثيلات متعددة من نفس الفئة التي تطبق قابلية التشغيل.

لكن النص الثاني لا يبدأ أبدًا.تمكنت من حل هذه المشكلة عن طريق إنشاء العديد من الفئات التي لها نفس قابلية التشغيل تمامًا.ولكن يبدو أنه من غير العملي للغاية أن يكون لديك 10-20 فصلًا متماثلًا.فهل يمكنني القيام بذلك بطريقة أو بأخرى خلال عملية تشغيل واحدة؟إليك الكود الذي يوضح كيف حاولت تشغيل البرامج النصية باستخدام ProcessBuilder:

public class TestScripts{

public static void main(String[] args){
       ScheduledThreadPoolExecutor threadPool = new ScheduledThreadPoolExecutor(2);
       threadPool.scheduleAtFixedRate(new MyTask1(), 1,2, TimeUnit.SECONDS);
       threadPool.scheduleAtFixedRate(new MyTask1(), 1,2, TimeUnit.SECONDS);
        }
  }


class MyTask1 implements Runnable{
public void run(){
     System.out.println("Task1 is running");
     ProcessBuilder processBuilder = new ProcessBuilder("C:\\Python27\\python.exe",
                                                        "C:\\Python27\\test.py");
     ProcessBuilder processBuilder2 = new ProcessBuilder("C:\\Python27\\python.exe",
                                                           "C:\\Python27\\test2.py");
    processBuilder.redirectOutput(Redirect.INHERIT);

    try {
        Process process = processBuilder.start();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        Process process2 = processBuilder.start();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
}
هل كانت مفيدة؟

المحلول

يوجد خطأ مطبعي في السطر الذي يبدأ العملية الثانية:

Process process2 = processBuilder.start();

يجب أن يكون بالطبع:

Process process2 = processBuilder2.start();

بالإضافة إلى أنك تقوم بجدولة مهمتين، حيث تبدأ كل مهمة عمليتين.لذا، كل ثانيتين يتم بدء 4 عمليات (2x test.py، 2x test2.py).إذا فهمت بشكل صحيح ما تحاول القيام به، جدولة واحدة فقط MyTask1 يبنغي أن يكون كافيا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top