Flutter Dart: Как мы можем достичь многопоточности, как python или java в дротике - PullRequest
0 голосов
/ 04 марта 2020

Я хочу достичь Поток A и Поток B работает параллельно и совместно использует глобальную переменную.

Ниже приведен код, написанный в python. То же самое я хочу сделать в Dart (я не хочу использовать будущее ожидание, потому что оно ожидает завершения другого потока sh или должно ждать.)

Переменная Case:

val 
ai ( a increment )
ad ( a decrement )
af ( a fail ) 
bi ( b increment )
bd ( b decrement )
bf ( b fail ) // when unable to get log

У меня есть две функции A () и B () и глобальная переменная val. Обе функции произвольно увеличивают или уменьшают глобальную переменную val. и исходя из этого я вычисляю ошибку и печатаю на консоль (записывается в функции pr)


O.val (Original val received at time of executing)
C.val (Calculated val)
err= ai - ad + bi - bd - val


_/+    O.val C.val    ai     ad  ai-ad      bi    bd  bi-ad    err

A- |     0    -1 |     0     1    -1 |      0     0     0 |    0
B+ |    -1     0 |     0     1    -1 |      1     0     1 |    0
A- |     0    -1 |     0     2    -2 |      1     0     1 |    0
B+ |    -1     0 |     0     2    -2 |      2     0     2 |    0
A- |     0    -1 |     0     3    -3 |      2     0     2 |    0
B- |    -1    -2 |     0     3    -3 |      2     1     1 |    0

Python сторона:

##############
# Python Code
# ############

import thread;
import time;

def lhrand(lo, hi): import random; return lo + int (random.random() * (hi - lo));

mutex= thread.allocate_lock();
val= 0;
ai= ad= af= 0;
bi= bd= bf= 0;

def pr(id, sign, _val):
    global val, ai, ad, af, bi, bd, bf;
    return "%s%s | %5d %5d | %5d %5d %5d |  %5d %5d %5d | %4d" % (id, sign, _val, val, ai, ad, af, bi, bd, bf, ai - ad + bi - bd - val);

def A(id):
   global val, ai, ad;
   for j in range(0, 10000):
       r= lhrand(0, 2);
       s= "-+"[r];
       w= [-1, 1][r];
       line= None;
       if mutex:
           if mutex.acquire():
               o= val;
               if r == 0: ad+= 1; else: ai+= 1;
               val= val + w;
               pr(id, "-" if r == 0 else "+", o);
               mutex.release();
               line= pr(id, s, o);
   print("%s over" % id);
   return 0;


def B(id):
   global val, bi, bd;
   for j in range(0, 10000):
       if mutex and mutex.acquire():
           r= lhrand(0, 2);
           o= x= val;
           if r == 0: bd+= 1;
           if r == 1: bi+= 1;
           x= x - 1 if r == 0 else x + 1;
           val= x;
           pr(id, "-" if r == 0 else "+", o);
           mutex.release();
   print("%s over" % id);
   return 0;

if __name__ == "__main__":
    x= thread.start_new_thread(A, ("A",))
    y= thread.start_new_thread(B, ("B",))
    time.sleep(5.0);
    pr("X", ".", val);

exit(0);

сторона дротика:

/////////////
//  Dart Code
/////////////

import "dart:async";
import "dart:math";
import "package:threading/threading.dart";
import "package:sprintf/sprintf.dart";

int val= 0;
int ai= 0, ad= 0, bi=0, bd= 0;
int num= 10000;

Lock _lock = new Lock();

var isLockEnable= true;

Random random= new Random();
int lhrand(lo, hi)
        {
        return lo + random.nextInt(hi - lo);
        }

int pr(id, sign, _val)
        {
        var s= sprintf("%s%s | %5d %5d | %5d %5d %5d |  %5d %5d %5d | %4d", [id, sign, _val, val, ai, ad, ai - ad, bi, bd, bi - bd, ai - ad + bi - bd - val]);
        print(s);
        return 0;
        }
Future A() async
        {
        int r, o, x;
        var id= "A";
        for(var j in Iterable<int>.generate(num).toList())
        {
        try
                {
                if(isLockEnable)
                        {
                        await _lock.acquire();
                        }
                o= await Future((){ return val; });
                x= val;
                r= lhrand(0, 2);
                x= val;
                if(r == 0) { ad++; }
                if(r == 1) { ai++; }
                x= (r == 0) ? x - 1 : x + 1;
                val= x;
                pr(id, (r == 0) ? "-" : "+", o);
                if(isLockEnable)
                        {
                        await _lock.release();
                        }
                }
        catch(e)
                {
                print("A failed to get lock.");
                }
        }
        print("$id over");
        }
Future B() async
        {
        int r, o, x;
        var id= "B";
        for(var j in Iterable<int>.generate(num).toList())
                {
                try
                        {
                        if(isLockEnable)
                                {
                                await _lock.acquire();
                                }
                        o= await Future((){ return val; });
                        r= lhrand(0, 2);
                        x= val;
                        if(r == 0) { bd++; }
                        if(r == 1) { bi++; }
                        x= (r == 0) ? x - 1 : x + 1;
                        val= x;
                        pr(id, (r == 0) ? "-" : "+", o);
                        if(isLockEnable)
                                {
                                await _lock.release();
                                }
                        }
                catch(e)
                        {
                        print("B failed to get lock.");
                        }
                }
        print("$id over");
        }
Future main() async
        {
        var AT= new Thread(A);
        print("AT : " + AT.hashCode.toString());
        var BT= new Thread(B);
        print("BT : " + BT.hashCode.toString());
        AT.start();
        BT.start();
        return 0;
        }

1 Ответ

1 голос
/ 04 марта 2020

Dart / Flutter является однопоточным и не позволяет совместно использовать глобальную переменную. У каждого изолята своя память, пространство и все. Чтобы он работал как многопоточный, вы должны использовать изоляты, и связь будет использоваться через порты, посылая сообщения друг другу. Если вы не хотите использовать Future, вы можете использовать изоляты.

Читать

  1. https://medium.com/flutter-community/flutter-threading-5c3a7b0c065f

  2. https://www.tutorialspoint.com/dart_programming/dart_programming_concurrency.htm

  3. https://pub.dev/packages/threading

...